Map和Reduce执行过程中,一共发生了3次排序:
1)当Map函数产生输出时,会首先写入内存的环形缓冲区,当达到设定的阈值,在溢写磁盘之前,后台线程会将缓冲区的数据划分成相应的分区,在每个分区中,按key进行排序。
2)在Map任务完成之前,磁盘上存在多个已分区并且已排序的溢写文件。这时,多个溢写文件将被合并成一个已分区并且已排序的输出文件。由于溢写文件经过了第一次排序,所以合并文件的过程只需要再做一次排序即可使输出文件整体有序。
3)在Reduce阶段,需要将多个Map任务的输出文件拷贝到ReduceTask中进行合并,由于经过第二次排序, 所以合并文件时只需再做一次排序即可使输出文件整体有序 。
在这3次排序中
第一次排序是在环形缓冲区发生的,使用的算法是快速排序。
第二次排序和第三次排序都是在文件合并阶段发生的,使用的是归并排序。