mapreduce && yarn 常见调优参数

1,323 阅读2分钟

1. mapreduce调优

map调优

  1. 自定义分区,减少数据倾斜
    • 自定义类,继承Partitioner接口,重写getPartition方法;
  2. 减少溢写次数
    • mapreduce.task.io.sort.mb shuffle的环形缓冲区大小,默认100M,可以提高到200M
    • mapreduce.map.sort.spill.precent 环形缓冲区溢出的阈值,默认80%,提高到90%
  3. 增加每次merge合并次数
    • mapreduce.task.io.sort.factor 默认10,提高到20
  4. 在不影响业务结果的前提下提前采用Combiner
    • job.setCombinerClass(xxxReducer.class)
  5. 为了减少磁盘IO, 可以采用Snappy或者LZO压缩
    • conf.setBoolean("mapreduce.map.output.compress", true)
    • conf.setClass("mapreduce.map.output.compress.codec", SnappyCodec.class,CompressionCodec.class)
  6. 可以根据128M数据对应1G内存原则提高该内存
    • mapreduce.map.memory.mb 默认MapTask内存上限1024MB
  7. 控制MapTask堆内存大小(内存不够, OOM)
    • mapreduce.map.java.opts
  8. 默认MapTask的CPU核数1, 计算密集型任务可以增加
    • mapreduce.map.cpu.vcores
  9. 异常重试
    • mapreduce.map.maxattempts 每个Map Task最大重试次数,一旦重试次数超过该值,则认为MapTask运行失败,默认值4.根据机器性能适当提高。

map调优

  1. reduce去map中拉取数据的并行数,默认5,可以提高到10
    • mapreduce.reduce.shuffle.parallelcopies
  2. buffer大小占Reduce可用内存的比例, 默认0.7.可以提高到0.8
    • mapreduce.reduce.shuffle.input.buffer.percent
  3. buffer中的数据达到多少比例开始写入磁盘。默认0.66,提高到0.75
    • mapreduce.reduce.shuffle.merge.percent
  4. 默认ReduceTask内存上限1024MB, 根据128M数据对应1G内存原则, 适当提高到4-6G
    • mapreduce.reduce.memory.mb
  5. 控制ReduceTask堆内存大小 (不够报OOM)
    • mapreduce.reduce.java.opts
  6. ReuceTask默认的CPU核心数1个.可以提高到2-4个
    • mapreduce.reduce.cpu.vcores
  7. 每个Reduce Task最大重试次数(超过则认为失败。默认为4)
    • mapreduce.reduce.maxattempts
  8. 当MapTask完成的比例达到该值才会为ReduceTask申请资源。默认是0.05
    • mapreduce.job.reduce.slowstart.completedmaps
  9. 如果一个task一段时间内没有读取新数据也没有输出则认为处于Block状态。时间默认值为600000(10分钟).如果程序对每条数据数据处理时间过长,建议调大
    • map.reduce.task.timeout
  10. 如果可以不用Reduce, 尽可能不用

2. Yarn调优

Resourcemanager相关

  1. 处理调度器请求的线程数量
    • yarn.resourcemanager.scheduler.client.thread-count ResourceManager
  2. 配置调度器
    • yarn.resourcemanager.scheduler.class

Nodemanager相关

  1. 使用内存数
    • yarn.nodemanager.resource.memory-mb NodeManager
  2. 为系统保留多少内存,和上一个参数二者取一即可
    • yarn.nodemanager.resource.system-reserved-memory-mb NodeManager
  3. 使用 CPU 核数
    • yarn.nodemanager.resource.cpu-vcores NodeManager
  4. 是否将虚拟核数当作 CPU 核数
    • yarn.nodemanager.resource.count-logical-processors-as-cores
  5. 虚拟核数和物理核数乘数,例如:4 核 8 线程,该参数就应设为 2
    • yarn.nodemanager.resource.pcores-vcores-multiplier
  6. 是否让 yarn 自己检测硬件进行配置
    • yarn.nodemanager.resource.detect-hardware-capabilities
  7. 是否开启物理内存检查限制 container
    • yarn.nodemanager.pmem-check-enabled
  8. 是否开启虚拟内存检查限制 container
    • yarn.nodemanager.vmem-check-enabled
  9. 虚拟内存物理内存比例
    • yarn.nodemanager.vmem-pmem-ratio

Container 容器相关

  1. 容器最小内存
    • yarn.scheduler.minimum-allocation-mb
  2. 容器最大内存
    • yarn.scheduler.maximum-allocation-mb
  3. 容器最小核数
    • yarn.scheduler.minimum-allocation-vcores
  4. 容器最大核数
    • yarn.scheduler.maximum-allocation-vcores