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来调高缓冲池大小。

参考

欢迎关注,更多惊喜等着你

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012957549/article/details/86660128
今日推荐