您的位置:首页 > 其它

MapReduce Shuffle性能调优

2016-03-09 22:45 162 查看

Map端优化

选项类型默认值描述
io.sort.mbint100缓存map中间结果的buffer大小(MB)
io.sort.record.percentfloat0.05io.sort.mb中用来保存map output记录边界的百分比,其他缓存用来保存数据
io.sort.spill.percentfloat0.80map开始做spill操作的阈值
io.sort.factorint10做merge操作时同时操作的stream数上限
min.num.spill.for.combineint3combiner函数运行的最小spill数
mapred.compress.map.outputbooleanfalsemap中间结果是否采用压缩
mapred.map.output.compression.codecclass nameorg.apache.hadoop.io.compress.DefaultCodecmap中间结果的压缩格式
io.sort.mb

一个map都会对应存在一个内存缓冲区kvbuffer,kvbuffer默认为100MB,大小可以根据job提交时设定的参数io.sort.mb来调整。当map产生的数据非常大,并且把io.sort.mb调大,那么在map计算过程中spill的次数就会降低,map task对磁盘的操作就会变少,如果map tasks的瓶颈在磁盘上,这样调整就会大大提高map的计算性能。

io.sort.spill.percent

io.sort.spill.percent控制的是kvbuffer开始spill到磁盘的阈值,默认为0.80。这个参数同样也是影响spill频繁程度,进而影响map task运行周期对磁盘的读写频率。

io.sort.factor

merge的过程中,有一个参数io.sort.factor可以调整这个过程的行为,默认为10。该参数表示当merge spill文件时,最多能有多少并行的stream向merge文件中写入。如果map的中间结果非常大,调大io.sort.factor,有利于减少merge次数,进而减少 map对磁盘的读写频率,有可能达到优化作业的目的。

min.num.spill.for.combine

当job指定了combiner时,会在map端根据combiner定义的函数将map结果进行合并。运行combiner函数的时机有可能会是merge完成之前或之后。这个时机由min.num.spill.for.combine参数控制,默认为3。通过这样的方式,就可以在spill非常多需要merge,并且很多数据需要做combine的时候,减少写入到磁盘文件的数据数量,同样减少了对磁盘的读写频率,有可能达到优化作业的目的。

mapred.compress.map.output

将这个参数设置为true时,那么map在写中间结果时,就会将先数据压缩后再写入磁盘,读结果时也会采用先解压后读取数据。这样做的后果就是:写入磁盘的中间结果数据量会变少,但是cpu会消耗一些用来压缩和解压。所以这种方式通常适合job中间结果非常大,瓶颈不在cpu,而是在磁盘的读写的情况。

mapred.map.output.compression.codec

当采用map中间结果压缩的情况下,通过mapred.map.output.compression.codec参数可以选择不同的压缩模式,现有支持的压缩格式:GzipCodec,LzoCodec,BZip2Codec,LzmaCodec等压缩格式。通常来说,想要达到比较平衡的cpu和磁盘压缩比,LzoCodec比较适合。但也要取决于job的具体情况。

Reduce端优化<
4000
/h2>

选项类型默认值描述
mapred.reduce.parallel.copiesint5每个reduce并行下载map结果的最大线程数
mapred.reduce.copy.backoffint300reduce下载线程最大等待时间(in sec)
io.sort.factorint10同上
mapred.job.shuffle.input.buffer.percentfloat0.7用来缓存shuffle数据的reduce task heap百分比
mapred.job.shuffle.merge.percentfloat0.66缓存的内存中多少百分比后开始做merge操作
mapred.job.reduce.input.buffer.percentfloat0.0sort完成后reduce计算阶段用来缓存数据的百分比
mapred.reduce.parallel.copies

对一个reduce来说,下载可以从并行的多个map中下载,并行度通过参数mapred.reduce.parallel.copies进行设置。默认为5个并行的下载线程,这个参数比较适合map很多并且完成的比较快的job的情况下调大,有利于reduce更快的获取属于自己部分的数据。

mapred.reduce.copy.backoff

reduce下载线程的最大下载时间段通过参数mapred.reduce.copy.backoff设置,默认为300s。如果超过改时间,reduce下载线程中断,并尝试从其他地方下载。

如果集群环境的网络本身是瓶颈,那么用户可以通过调大这个参数来避免reduce下载线程被误判为失败的情况。不过在网络环境比较好的情况下,没有必要调整。

io.sort.factor

Reduce将map结果下载到本地时,同样也是需要进行merge,所以io.sort.factor的配置选项同样会影响reduce进行 merge时的行为,可能通过调大这个参数来加大一次merge时的并发吞吐,优化reduce效率。

mapred.job.shuffle.merge.percent

mapred.job.shuffle.merge.percent这个限度阈值可以控制merge的开始,默认为0.66。如果下载速度很快,很容易就把内存缓存撑大,那么调整一下这个参数有可能会对reduce的性能有所帮助。

mapred.job.reduce.input.buffer.percent

mapred.job.reduce.input.buffer.percent参数默认为0,表示reduce是全部从磁盘开始读处理数据。如果这个参数大于0,那么就会有一定量的数据被缓存在内存并输送给reduce,当reduce计算逻辑消耗内存很小时,可以分一部分内存用来 缓存数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息