MR-Shuffle
-
阶段定义
MapTask: map--------sort map: Mapper.map()中将输出的key-value写出之前 sort: Mapper.map()中将输出的key-value写出之后
-
sort
①当在map()将输出的key-value写出后,记录是会被Partitioner计算一个分区号
②计算后,记录被收集到一个缓冲区(MapOutPutBuffer)
③收集线程负责向缓冲区收集数据,缓冲区初始值为100M,当使用到80%阈值,
唤醒溢写线程,溢写线程会将缓冲区已经收集的数据溢写到磁盘
④在溢写前,会对缓冲区中的数据进行排序(快速排序),在排序时,只通过比较key进行排序
⑤排序后,按照分区,依次将数据写入到磁盘的临时文件的若干分区中
⑥每次溢写都会生成一个临时文件,当所有的数据都溢写完成之后,会将所有的临时文件片段合并为一个总的最终的文件
⑦在合并时,将所有的临时文件的相同分区的数据,进行合并,合并后再对所有的数据进行排序(归并排序)
⑧最终生成一个结果文件,这个文件分为若干分区,每个分区的数据已经按照key进行了排序,等待reduceTask的shuffle线程来拷贝数据!