8.4.3 Sort和Reduce阶段分析

当所有数据拷贝完成后,数据可能存放在内存中或者磁盘上,此时还不能将数据直接交给用户编写的reduce()函数处理。根据MapReduce语义,Reduce Task需将key值相同的数据聚集到一起,并按组将数据交给reduce()函数处理。为此,Hadoop采用了基于排序的数据聚集策略。前面提到,各个Map Task已经事先对自己的输出分片进行了局部排序,因此,Reduce Task只需进行一次归并排序即可保证数据整体有序。为了提高效率,Hadoop将Sort阶段和Reduce阶段并行化。在Sort阶段,Reduce Task为内存和磁盘中的文件建立了小顶堆,保存了指向该小顶堆根节点的迭代器,且该迭代器保证了以下两个约束条件:

❑磁盘上文件数目小于io.sort.factor(默认是10)。

❑当Reduce阶段开始时,内存中数据量小于最大可用内存(JVM Max Heap Size)的mapred.job.reduce.input.buffer.percent(默认是0)。

在Reduce阶段,Reduce Task不断地移动迭代器,以将key相同的数据顺次交给reduce()函数处理,期间移动迭代器的过程实际上就是不断调整小顶堆的过程,这样,Sort和Reduce可并行进行。