MapReduce优化的入手点
– 合理设定Map/Reduce数量
– 如果可能,使用Combiner减少中间数据输出
– 对中间数据和最终结果启用压缩
– 减少Shuffle过程中写入磁盘的数据
– 适当增大每个节点的处理任务的并发度
1. 合理设定Map数量
Mapper数量不能直接设定
1.1 可以通过选择BlockSize间接调整Mapper数量
hdfs-site.xml 中
• dfs.blocksize
– 文件Block大小
1.2 压缩输入文件
1.3 重写InputFormat,覆盖getSplits方法
2. 适当选择Reducer数量
Reducer数量由程序指定,默认为1,我们可以提高他,Reducer数量过小导致并发度不够,过大导致Linux频繁进行任务切换,反而不好。
hdfs-site.xml 中
• mapred.reduce.parallel.copies
– Reducer数量
3 如果可能,使用Combiner减少中间数据输出
对中间数据和最终结果启用压缩
# 设定map reduce 之间是否启用压缩
– mapred.compress.map.output = true :开启压缩
– mapred.map.output.compression.codec = com.hadoop.compression.lzo.LzoCodec :设定压缩算法
# 最终的输出结果是否启动压缩
– mapred.output.compress = true :
– mapred.output.compression.codec = com.hadoop.compression.lzo.LzoCodec
– mapred.output.compression.type = BLOCK
4 减少Shuffle到磁盘的数量
4.1 io.sort.mb
- 指定了排序使用的内存
- 推荐:100 – 不宜过大,否则严重占用系统内存
- -
4.2 io.sort.spill.percent
- 指定了排序的内容达到内存(io.sort.mb )的多少比例开始写一个排序文件,清空内存,读取下一段的要排序的内容。
- 多大比例时开始spill(写磁盘),默认0.80,基本不需要调整
4.3 io.sort.record.percent
- 指定了排序的头部索引达到内存(io.sort.mb )的多少比例开始写一个排序文件,清空内存,读取下一段的要排序的内容。
- Kv数组长度与内存量的百分比,默认0.05
4.4 io.sort.factor
- Reducer侧一次对多少文件进行归并排序,推荐:100
4.5 mapred.job.shuffle.input.buffer.percent
- Reducer侧的shuffle buffer占其heap的比例
mapred.reduce.parallel.copies - – Reducer侧同时并发拷贝Map结果的数量,推荐20-50
5. 适当增大每个节点的处理任务的并发度
待续。。。
6 其他
› ulimit调高同时打开文件描述符及网络连接、关闭swap
› JVM参数:-XX:+UseConcMarkSweepGC -XX:NewSize=300M -XX:MaxNewSize=300M -XX:+DoEscapeAnalysis -XX:+UseCompressedOops - XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/ - XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly"
› mapreduce.jobtracker.heartbeat.interval.min
› 多盘读写:mapred.local.dir
› 增加rpc handler:mapred.job.tracker.handler.count
› split数量:mapred.min.split.size/mapred.max.split.size
› speculative:mapred.map.tasks.speculative.execution、 mapred.reduce.tasks.speculative.execution
› 任务失败次数:mapred.max.map.failures.percent/reduce, mapred.map.max.attempts/reduce
› 多任务共享VM: mapred.job.reuse.jvm.num.tasks
› 任务超时:mapred.task.timeout
› DistributedCache
› 慢启动:mapred.reduce.slowstart.completed.maps
› 优先级:mapred.job.priority
› 用户端设置:mapred.child.java.opts