pergrand 发表于 2016-7-10 23:44:30

详解MapReduce中shuffle过程

本帖最后由 pergrand 于 2016-7-10 23:47 编辑



shuffle
      shuffle过程中的几个名词:shuffle:洗牌;spill:溢出;combiner:合成;merge:融入混合;copy:复制
      shuffle的使用地点:发生在map task输出结果传送到reduce task 输入的阶段
      使用shuffle的好处:在从map task端拉取数据到reduce task端时,减少宽带的消耗,
                        将数据完整的从map task端拉取数据到reduce task端
                        减少磁盘IO对task的影响
      shuffle过程理解:
                        1.在map task端,输入的数据来源于hdfs,切分成片来读取,默认一个block对于一个split。
            在map端执行详细过程:
                        2.在执行完mapper后,mapper的输出时k/v对。需要给reduce task处理,不同的k/v给哪个reduce处理呢(假设不只有一个reduce)
                        在这里执行partioner(默认是对key hash,在以ruduce 任务的数量取模。可以看源码)也可以自定义分区。
                        假如对一个key经过partitioner计算后得到0,那么就确定了分区是part-r-00000;
                        确定分区之后将该对值写入map的缓存区
                        1.就这样在map task端将输出的数据写入缓冲区直到到达阈值(默认缓冲区大小100M,阈值是80%).
                        达到阈值启动溢写线程(spill)将前面80M的数据写入到磁盘一个文件,这个单独的溢写线程不会影响map task,因为还有20M空间供map task输出结果
                        启动溢写线程后,对即将写到磁盘上的80M数据的key做排序(sort)。
                        2.前面处理了一个k/v进入到哪个reduce task,在讲很多k/v写入磁盘时,每一个都知道自己应该被哪个reduce执行,则在磁盘文件时去同一个reduce端的在一起拼团这个过程叫combiner。
                        combiner是个优化过程,这样可以减少map和reduce任务之间传输的中间数据,减少partition的索引记录。(例如我之前的单词计数例子中map输出的是<hello,1><hello,1>到reduce输入端时<hello,2>)
                        combiner的使用可以提高效率但是使用不当反而会影响效率。
                        在这里思考下:Combiner本身已经执行了reduce操作,为什么在Reducer阶段还要执行reduce操作?
                        combiner操作发生在map端,处理一个任务所接收的文件中的数据,不能跨map任务执行;只有reduce可以接收多个map任务处理的数据(reduce会拉取不同map 端输出的数据放入一个缓冲区)。
                        3.如果数据很大,会发生多次溢写既会有多个溢写文件。当map task完成,所有的输出数据都在一些磁盘溢写文件中,然后将多个溢写文件合并到一个文件中这个过程就是merge。
                        在merge时进行group,把不同map中的相同key合为一个做例如<hello,{1,1}>。如果设置了combiner也会合并切求和或者求平均值(自己定义)
                        注意,如果没有发生spill也没指定combiner产生的文件里存放的是map的输出例如<hello,1><hello,1>可以通过设置reduce task数量为0 查看part-m-00000文件看
                        3.到此map端工作结束,生成的这个文件存放在taskTracker能拿到的某个本地目录内,每个reduce task不断地通过RCP从JobTacker那后去map task是否完成。如果reduce task 得到通知获知
                              某台TaskTrack上的map task执行完成,shuffle开始执行将map的输出拉入reduce过程。
                        4.rudecer真正执行之前就是不断的拉取当前job里的每个map输出结果然后不断的merge,最终形成一个文件作为reduce task的输入文件。
                在reduce 端执行详细过程:
                              1.copy过程:拉取数据,reduce进程启动一些数据copy线程(Fetcher),通过http方式请求map task所在的TaskTrack 获取map task输出文件(文件被TaskTracker管理在本地磁盘)。

                              2.merge阶段:merge 动作copy过来的数据先放入内存缓冲区,merge有三种方式:1内存到内存;2内存到磁盘,3磁盘到磁盘默认不启用第一种。类似map中的过程,当到达阈值时也会spill,如果设置combiner也会启用,
                                        在磁盘溢写了很多文件,直到map端没有数据,第二种merge方式结束。然后启用第三种方式merge生成最终的哪个文件

                              3.reduce的输入文件:最后生成的那个文件默认存在磁盘中shuffle结束,然后执行reducer,把结果放到HDFS上


pergrand 发表于 2016-7-10 23:50:11

还有很多细节和一些优化的过程没搞清楚,如果有错误的地方希望给予指正,互相学习

Mr.k 发表于 2016-7-13 11:23:18

写的不错,原理还是摇要懂,学习

ggggying12 发表于 2017-2-22 18:23:59

好好学习,天天向上

zhouzhou 发表于 2017-3-7 16:53:19

非常感谢楼主啊

liuyou2036 发表于 2020-7-16 10:26:55

多谢分享
页: [1]
查看完整版本: 详解MapReduce中shuffle过程