MapReduce shuffle性能调优

3 篇文章 0 订阅
3 篇文章 0 订阅

性能调优

如果能够根据情况对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.mbint100用于map输出排序的内存大小
mapreduce.map.sort.spill.percentfloat0.80开始spill的缓冲池阈值
mapreduce.task.io.sort.factorint10合并文件数最大值,与reduce共用
mapreduce.map.combine.minspillsint3运行combiner的最低spill文件数
mapreduce.map.out.compressbooleanfalse输出是否压缩
mapreduce.map.out.compress类名DefaultCodec压缩算法
mapreduce.shuffle.max.threadsint0服务于reduce提取结果的线程数量

reduce优化

在reduce端,如果能够让所有数据都保存在内存中,可以达到最佳的性能。通常情况下,内存都保留给reduce函数,但是如果reduce函数对内存需求不是很高,将mapreduce.reduce.merge.inmem.threshold(触发合并的map输出文件数)设为0,mapreduce.reduce.input.buffer.percent(用于保存map输出文件的堆内存比例)设为1.0,可以达到很好的性能提升。

reduce端相关属性:

属性名值类型默认值说明
mapreduce.reduce.shuffle.parallelcopiesint5提取map输出的copier线程数
mapreduce.reduce.shuffle.maxfetchfailuresint10提取map输出最大尝试次数,超出后报错
mapreduce.task.io.sort.factorint10合并文件数最大值,与map共用
mapreduce.reduce.shuffle.input.buffer.percentfloat0.70copy阶段用于保存map输出的堆内存比例
mapreduce.reduce.shuffle.merge.percentfloat0.66开始spill的缓冲池比例阈值
mapreduce.reduce.shuffle.inmem.thresholdint1000开始spill的map输出文件数阈值,小于等于0表示没有阈值,此时只由缓冲池比例来控制
mapreduce.reduce.input.buffer.percentfloat0.0reduce函数开始运行时,内存中的map输出所占的堆内存比例不得高于这个值,默认情况内存都用于reduce函数,也就是map输出都写入到磁盘

通用优化

Hadoop默认使用4KB作为缓冲,这个算是很小的,可以通过io.file.buffer.size来调高缓冲池大小。

参考

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

这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值