整体流程
五个阶段
- shuffle阶段:也称为copy阶段,从各个Map Task上远程拷贝一片数据,如果大小超过阈值,落盘,否则放内存中
- Merge阶段:远程拷贝数据的同时,Reduce Task启动两个后台线程对内存和磁盘上的文件进行合并,防止内存使用过多或磁盘上文件过多。
- Sort阶段:按照MapReduce语义,用户编写的reduce()函数输入数据是按key聚集的一组数据,为了将key相同的数据聚在一起,hadoop采用了排序的策略,由于map task已经局部排序,因此,reduce task只要进行一次归并排序就ok。
- reduce阶段:将每组数据交给reduce函数处理
- write阶段:reduce函数将计算结果写到HDFS上。
shuffle和merge阶段
reduce task中,shuffle和merge是并行进行的。
三个阶段:
- 准备运行完成的Map Task列表:GetMaoEventsThread线程周期性通过RPC从TaskTracker获取已经完成的Map Task列表,保存到映射表mapLocations(保存了TaskTracker Host与已完成任务列表的映射关系)中,为防止出现网络热点,Reduce Task通过对所有TaskTracker Host进行”混洗“操作以打乱数据拷贝顺序,并将调整后的Map Task输出数据位置保存到scheduledCopies列表中。
- 远程数据拷贝:Reduce Task同时启动多个MapOutputCopier线程, 这些线程从scheduledCopies列表中获取Map Task输出位置,并通过HTTP Get远程拷贝数据,对于获取的数据分片,如果大小超过一定阈值(默认是一个数据分片大小不能超过该内存的0.25倍,则可以放在内存中),则落盘,否则放内存。
- 合并内存文件和磁盘文件:为了防止内存或者磁盘上文件数据过多,Reduce Task启动了LocalFSMerger和InMemFSMergeThread两个线程分别对内存和磁盘上的文件进行合并。
Sort和Reduce阶段
Sort和Reduce可以并行。
Sort阶段,Reduce Task为内存和磁盘中的文件建立了小顶堆,保存了指向该小顶堆根节点的迭代器。
在Reduce阶段,Recuce Task不断移动迭代器,以将key相同的数据顺次交给reduce()函数处理,期间移动迭代器的过程实际上就是不断调整小顶堆的过程。