MapReduce Shuffle性能调优
2016-03-09 22:45
162 查看
Map端优化
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
io.sort.mb | int | 100 | 缓存map中间结果的buffer大小(MB) |
io.sort.record.percent | float | 0.05 | io.sort.mb中用来保存map output记录边界的百分比,其他缓存用来保存数据 |
io.sort.spill.percent | float | 0.80 | map开始做spill操作的阈值 |
io.sort.factor | int | 10 | 做merge操作时同时操作的stream数上限 |
min.num.spill.for.combine | int | 3 | combiner函数运行的最小spill数 |
mapred.compress.map.output | boolean | false | map中间结果是否采用压缩 |
mapred.map.output.compression.codec | class name | org.apache.hadoop.io.compress.DefaultCodec | map中间结果的压缩格式 |
一个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.copies | int | 5 | 每个reduce并行下载map结果的最大线程数 |
mapred.reduce.copy.backoff | int | 300 | reduce下载线程最大等待时间(in sec) |
io.sort.factor | int | 10 | 同上 |
mapred.job.shuffle.input.buffer.percent | float | 0.7 | 用来缓存shuffle数据的reduce task heap百分比 |
mapred.job.shuffle.merge.percent | float | 0.66 | 缓存的内存中多少百分比后开始做merge操作 |
mapred.job.reduce.input.buffer.percent | float | 0.0 | sort完成后reduce计算阶段用来缓存数据的百分比 |
对一个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计算逻辑消耗内存很小时,可以分一部分内存用来 缓存数据。
相关文章推荐
- Hadoop_2.1.0 MapReduce序列图
- MySQL 优化
- Google排名优化的几个影响因素
- 选定虚拟主机 性能凸显优势
- DB2优化(简易版)
- 修改一行代码提升 Postgres 性能 100 倍
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- 推荐Sql server一些常见性能问题的解决方法
- Asp编码优化技巧
- SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能
- 和表值函数连接引发的性能问题分析
- SQLServer 2000 升级到 SQLServer 2008 性能之需要注意的地方之一
- 如何监测和优化OLAP数据库
- mysql -参数thread_cache_size优化方法 小结
- 深入学习SQL Server聚合函数算法优化技巧
- 数据库性能优化三:程序操作优化提升性能