Map
阶段执行过程1:框架会把输入文件(夹)划分为不少InputSplit,默认,每一个HDFS的Block对应一个InputSplit。经过RecordReader类,把每一个InputSplit解析成一个个<K1,V1>。默认,每一行会被解析成一个<K1,V1>。 2:框架调用Mapper类中的map(...)函数,map函数的形参是<K1,V1>,输出是<K2,V2>。一个InputSplit对应一个map task。 3:框架对map函数输出的<K2,V2>进行分区。不一样分区中的<K2,V2>由不一样的reduce task处理,默认只有一个分区。 4:框架对每一个分区中的数据,按照K2进行排序、分组。分组指的是相同K2的V2分红一个组。 5:在map节点,框架能够执行reduce归约,此步骤为可选顶。 6:框架会把map task输出的<K2,V2>写入到Linux的磁盘文件中。 至此,整个map阶段结束。
MapReduce之reduce
阶段执行过程网络
1:框架对多个map任务的输出,按照不一样的分区,经过网络copy到不一样的reduce节点,这个过程称做shuffle。 2:框架对reduce端接收到的相同分区的<K2,V2>数据进行合并、排序、分组。 3:框架调用Reducer类中的reduce方法,输入<K2,{V2...}>,输出<K3,V3>。一个<K2,{V2...}>调用一次reduce函数。 4:框架把reduce的输出保存到HDFS中。 至此,整个reduce阶段结束。