Shuffle阶段的自我理解

来源:互联网 发布:sql group by 第一个 编辑:程序博客网 时间:2024/05/18 03:12

Shuffle阶段的概述

Shuffle是连接map,reduce两个管道的衔接套。Map的输出经过partition写到内存的buffer里面,当内存满了的时候,会排序写到零时文件,这样当mapTask整个运行完之后,会产生一大堆零时文件,shuffle要把它们merge在一起。(会调用combine函数)
Reduce端通过TaskTracker监听到自己的需要数据的哪个map运行完了,就回去pull数据,先copy到本地,然后把从不同Node搞来的数据merge成一个大文件。作为Reduce job的输入。

Map端详述

1,主要代码阅读参考MapTask类。
2,主要的参数
- spillper,设置buffer使用率达到多少时,开始写零时文件,默认是0.8
- sortmb:内存buf的大小,默认是100MB
- indexCacheMemoryLimit:内存index的大小,默认是1024*1024
- sorter:对mapper输出的key进行排序,默认是quick sort
3,主要流程
- 对 Map的输出键值对计算partition,写入buffer(MapOutputBuffer类)。
- buffer内存使用率达到spillper值时,会冻结这部分并写到零时文件中。
- merge阶段,多路归并算法把零时有序文件合并成一个整体有序文件。

Reduce端详述

1,主要代码阅读参考MergeManagerImpl类
2,主要参数
- mapreduce.job.reduce.slowstart.completedmaps,设置maptask完成多少时触发reduce来fetch,默认是0.05
- mapreduce.job.reduce.shuffle.read.timeout, 设置fetch的timeout,默认是3分钟
- mapreduce.job.reduce.shuffle.maxfetchfailures: 设置fetch的最大失败次数,默认是10次
- mapreduce.job.reduce.shuffle.parallecopies:同时创建的fetch进程个数
- mapreduce.job.reduce.shuffle.input.buffer.percent: copy阶段内存使用的最大值,默认是0.9
- mapreduce.task.io.sort.factor每次merge的文件个数
- mapreduce.reduce.shuffle.merge.percent,触发merge 的内存条件,默认是java heap size * 0.9 * 0.9
3,主要流程:
- fetch拉取数据到本地,存在内存或者磁盘
- merge成一个文件,包含内存merge,磁盘merge,finalmerge等阶段。

总结

1,mapreduce的优化通常围绕shuffle的过程展开;包括如何增加并发,多用内存少用磁盘,排序算法的选择等等。
2,通过定义combiner省略中间文件的大小,从而达到节约内存及复制时间的目的。
3,在排序过程中的一个核心算法是多路文件归并算法,影响的参数有mapreduce.task.io.sort.factor。

0 0
原创粉丝点击