MR-Shuffle

  1. 阶段定义

     MapTask:   map--------sort
     map:   Mapper.map()中将输出的key-value写出之前
     sort: Mapper.map()中将输出的key-value写出之后
    
  2. sort

    ①当在map()将输出的key-value写出后,记录是会被Partitioner计算一个分区号

    ②计算后,记录被收集到一个缓冲区(MapOutPutBuffer)

    ③收集线程负责向缓冲区收集数据,缓冲区初始值为100M,当使用到80%阈值,

    唤醒溢写线程,溢写线程会将缓冲区已经收集的数据溢写到磁盘

    ④在溢写前,会对缓冲区中的数据进行排序(快速排序),在排序时,只通过比较key进行排序

    ⑤排序后,按照分区,依次将数据写入到磁盘的临时文件的若干分区中

    ⑥每次溢写都会生成一个临时文件,当所有的数据都溢写完成之后,会将所有的临时文件片段合并为一个总的最终的文件

    ⑦在合并时,将所有的临时文件的相同分区的数据,进行合并,合并后再对所有的数据进行排序(归并排序)

    ⑧最终生成一个结果文件,这个文件分为若干分区,每个分区的数据已经按照key进行了排序,等待reduceTask的shuffle线程来拷贝数据!

posted @ 2020-07-23 08:20  Loading~  阅读(129)  评论(0编辑  收藏  举报