MapReduce shuffle性能调优
性能调优
如果能够根据情况对shuffle过程进行调优,对于提供MapReduce性能很有帮助。相关的参数配置列在后面的表格中。
一个通用的原则是给shuffle过程分配尽可能大的内存,当然你需要确保map和reduce有足够的内存来运行业务逻辑。因此在实现Mapper和Reducer时,应该尽量减少内存的使用,例如避免在Map中不断地叠加。
运行map和reduce任务的JVM,内存通过mapred.child.java.opts
属性来设置,尽可能设大内存。容器的内存大小通过mapreduce.map.memory.mb和mapreduce.reduce.memory.mb
来设置,默认都是1024M。
map优化
在map端,避免写入多个spill文件可能达到最好的性能,一个spill文件是最好的。通过估计map的输出大小,设置合理的mapreduce.task.io.sort.*
属性,使得spill文件数量最小。例如尽可能调大mapreduce.task.io.sort.mb
。
map端相关的属性如下表:
属性名 | 值类型 | 默认值 | 说明 |
---|---|---|---|
mapreduce.task.io.sort.mb | int | 100 | 用于map输出排序的内存大小 |
mapreduce.map.sort.spill.percent | float | 0.80 | 开始spill的缓冲池阈值 |
mapreduce.task.io.sort.factor | int | 10 | 合并文件数最大值,与reduce共用 |
mapreduce.map.combine.minspills | int | 3 | 运行combiner的最低spill文件数 |
mapreduce.map.out.compress | boolean | false | 输出是否压缩 |
mapreduce.map.out.compress | 类名 | DefaultCodec | 压缩算法 |
mapreduce.shuffle.max.threads | int | 0 | 服务于reduce提取结果的线程数量 |
reduce优化
在reduce端,如果能够让所有数据都保存在内存中,可以达到最佳的性能。通常情况下,内存都保留给reduce函数,但是如果reduce函数对内存需求不是很高,将mapreduce.reduce.merge.inmem.threshold
(触发合并的map输出文件数)设为0,mapreduce.reduce.input.buffer.percent
(用于保存map输出文件的堆内存比例)设为1.0,可以达到很好的性能提升。
reduce端相关属性:
属性名 | 值类型 | 默认值 | 说明 |
---|---|---|---|
mapreduce.reduce.shuffle.parallelcopies | int | 5 | 提取map输出的copier线程数 |
mapreduce.reduce.shuffle.maxfetchfailures | int | 10 | 提取map输出最大尝试次数,超出后报错 |
mapreduce.task.io.sort.factor | int | 10 | 合并文件数最大值,与map共用 |
mapreduce.reduce.shuffle.input.buffer.percent | float | 0.70 | copy阶段用于保存map输出的堆内存比例 |
mapreduce.reduce.shuffle.merge.percent | float | 0.66 | 开始spill的缓冲池比例阈值 |
mapreduce.reduce.shuffle.inmem.threshold | int | 1000 | 开始spill的map输出文件数阈值,小于等于0表示没有阈值,此时只由缓冲池比例来控制 |
mapreduce.reduce.input.buffer.percent | float | 0.0 | reduce函数开始运行时,内存中的map输出所占的堆内存比例不得高于这个值,默认情况内存都用于reduce函数,也就是map输出都写入到磁盘 |
通用优化
Hadoop默认使用4KB作为缓冲,这个算是很小的,可以通过io.file.buffer.size
来调高缓冲池大小。
参考
- 《Hadoop权威指南》
- https://blog.****.net/bingduanlbd/article/details/51933914
- http://ercoppa.github.io/HadoopInternals/AnatomyMapReduceJob.html
- http://www.****.net/article/2014-05-19/2819831-TDW-Shuffle/1
- https://hadoopabcd.wordpress.com/2015/06/29/how-mapreduce-works/
- http://grepalex.com/2012/09/24/map-partition-sort-spill/