2020-10-10

shuffle机制

具体Shuffle过程详解,如下:

1MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中

2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件

3)多个溢出文件会被合并成大的溢出文件

4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序

5ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据

6ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)

7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)

注意:

1Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。

2)缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb默认100M

3)源码解析流程

=================== MapTask ===================

context.write(k, NullWritable.get());   //自定义的map方法的写出,进入

output.write(key, value); 

         //MapTask727行,收集方法,进入两次

collector.collect(key, value,partitioner.getPartition(key, value, partitions));

         HashPartitioner(); //默认分区器

collect()  //MapTask1082行 map端所有的kv全部写出后会走下面的close方法

         close() //MapTask732行

         collector.flush() // 溢出刷写方法,MapTask735行,提前打个断点,进入

sortAndSpill() //溢写排序,MapTask1505行,进入

    sorter.sort()   QuickSort //溢写排序方法,MapTask1625行,进入

mergeParts(); //合并文件,MapTask1527行,进入

   

collector.close();

=================== ReduceTask ===================

if (isMapOrReduce())  //reduceTask324提前打断点

initialize()   // reduceTask333行,进入

init(shuffleContext);  // reduceTask375行,走到这需要先给下面的打断点

        totalMaps = job.getNumMapTasks(); // ShuffleSchedulerImpl第120行,提前打断点

         merger = createMergeManager(context); //合并方法,Shuffle第80行

                          // MergeManagerImpl第232 235行,提前打断点

                          this.inMemoryMerger = createInMemoryMerger(); //内存合并

                          this.onDiskMerger = new OnDiskMerger(this); //磁盘合并

                  eventFetcher.start();  //开始抓取数据,Shuffle第107行,提前打断点

                  eventFetcher.shutDown();  //抓取结束,Shuffle第141行,提前打断点

                  copyPhase.complete();   //copy阶段完成,Shuffle第151行

                  taskStatus.setPhase(TaskStatus.Phase.SORT);  //开始排序阶段,Shuffle第152行

         sortPhase.complete();   //排序阶段完成,即将进入reduce阶段 reduceTask382行

reduce();  //reduce阶段调用的就是我们自定义的reduce方法,会被调用多次

         cleanup(context); //reduce完成之前,会最后调用一次Reducer里面的cleanup方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值