大数据:MapReduce Shure性能调优

1. Map端优化

(1) io.sort.mb

       一个Maop都会对应存在一个内存缓冲区kvbuffer,kvbuffer默认为100MB,大小可以根据Job是提交时设定的参数io.sort.mb

来调整。当Map产生的数据非常大,那么在 Map计算过程中Spill的次数就会降低,Map task 对磁盘的操作就会变少,如果Map ask的瓶颈在磁盘上,这样调整就会大大提高Map的计算性能。

(2) io.sort.spill.percent

        io.sort.spill.percent控制的是kvuffer开始spill到磁盘的阈(yu‘第四声’)值,默认为0.80。这个参数同样也是影响spill频繁程度,进而影响Map task运行周期对磁盘的读写频率。

(3) io.sort.factor

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

(4) min.num.spill. for.combine

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

(5) mapred.compress. map.output

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

(6) mapred.map.output.compression.codec

       当采用Map中间结果压缩的情况下,通过mapred.map. oupul.coprpssion codee参数可以选择不同的压缩模式,现有支持的压缩格式有GzipCodec、LzoCodec、BZip2Codec、LzmaCodec等。通常来说,想要达到比较平面的CPU和概监压比,LzoCodec比较适合,但也要取决于Job的具体情况。

2. Reduce 端优化

(1) mapred.reduce. parallel.copies

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

(2) mapred.reduce .copy.backoff

      Reduce下载线程的最大下载时间段通过参数mapred.reduce.copy.backoff设置,默认为300秒。如果超过该时间,Reduce 下载线程中断,并尝试从其他地方下载。如果集群环境的网络本身是瓶颈,那么用户可以通过调大这个参数来避免Reduce下载线程被误判为失败的情况。不过在网络环境比较好的情况下,没有必要调整。

(3) io.sort. factor

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

(4)mapred.job.shuffle.merge.percent

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

(5)mapred.job.ruduce.input.buffer.percent

        mapred.job.ruduce.input.buffer.percent参数默认为0,表示Reduce是全部从磁盘开始读取并处理数据。如果这个参数大于0,那么就会有一定的数据被缓存在内存并输送给Reduce,当Reduce计算逻辑消耗内存很小时,可能分一部分内存原来缓存数据。

     

     

发布了165 篇原创文章 · 获赞 442 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_44015669/article/details/104087288