1. 分区partition
每个MapTask的输出都会被分割为多个分区,Reducer会根据JobTask维护的映射关系获取自己应该处理的那一份。
有多少个Reducer,Mapper的输出就应该有多少个分区。
这个分区动作叫做partition,具体逻辑是由partitioner类实现(用户可以自定义自己的partitioner),partition的职责就是保证MapTask输出的数据中具有同类Key的数据进入同一个Reducer进行处理。
3. 三次排序
Mapper输出阶段,缓冲区溢写时,溢写结果是分区内排序的。
Shuffle阶段,合并溢写文件时需要分区内排序(归并排序)。
Copy阶段(Reducer输入阶段),从各个Mapper收集过来的数据先入Reducer的缓冲区,溢写(merge)时整体排序(归并排序)。