从Hadoop配置文件深刻理解MapReduce优化

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到磁盘的数量

从Hadoop配置文件深刻理解MapReduce优化_第1张图片

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

你可能感兴趣的:(hadoop)