MapReduce工作机制详解(MapTask和ReduceTask)

MapTask:

1.maptask0负责切片0 ,maptask1负责切片1,maptask2负责切片2。

2.maptask0通过一个组件TextinputFormat读切片0,这个组件封装一个LineRecordReader,里面有next方法,每调一次方法从切片0里读一行,给maptask返回k1:行起始offset和value1:行内容。

3.调用mapper里的map(k1,v1,context)方法,再返回context.write(k2,v2)。

4.mapTask收到k2 v2,再调用mapTask里的工具类,调用outputColletor.collect(),序列化,变成二进制,放到一个环形的缓冲区。

5.不断向缓冲区放输出的数据,环形缓冲区默认是100M,当放入容量差不多达到80%,把数据溢出调用组件spiler.spill(),在过程中先分区:k.hashcode%reducetasts排序:同一个区内按key排序,得到分区,根据这个分区文件写到磁盘里去。(算法是快速排序算法)

6.当缓冲结束,读取切片完成,会把溢出文件合并,对局部数据通过归并排序(外部排序算法)。

MapReduce工作机制详解(MapTask和ReduceTask)

ReduceTask

1.reduceTask0从多个mapTask拿到的partiton0的数据合并放在本地磁盘。

2.调用XXXReducer类里的reduce(Text key,迭代器 values,context),输出数据context.write(k3,v3)

3.调用TextOtputFormat里的RecordWriter.write(k3,v3)

4.然后在指定的HDFS的目录写文件。