最近花了点时间整理了一下,涵盖了全流程常见实用的调优参数.
希望能有帮助
1)Map阶段
(1) 增大环形缓冲区大小(默认100M,可以提高到200M)
mapreduce.take.io.sort.mb
(2)增大环形缓冲区溢写的比例(默认80%,可以提高到90%)
mapreduce.map.sort.spill.percent
(3)减少对溢写文件的merge次数(默认10个文件,可以增大到20)
mapreduce.task.io.sort.factor
(4)不影响实际业务的前提下,采用Combiner提前合并,减少IO(这个最实用,效率看得见!!!)
2)Reduce阶段
(1)合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间;太多,会导致Map、Reduce任务见竞争资源,造成处理超时等错误.
(2)设置Map、Reduce共存:使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间.
mapreduce.job.reduce.slowstart.completedmaps (默认0.05)
(3)规避使用Reduce,因为Redce在用于连接数据集的时候将会产生大量的网络消耗
(4)增加每个Reduce去Map中拿数据的并行数
mapreduce.reduce.shuffle.parallelcopies
(5)集群性能可以的前提下,增大Buffer大小占用Reduce可用内存的比例(默认0.7,可以提高到0.8)
mapreduce.reduce.shuffle.input.buffer.percent
(6)Buffer中的数据达到多少比例开始写入磁盘(默认0.66,可以提高到0.75)
mapreduce.reduce.shuffle.merge.percent
3)IO传输
采用数据压缩的方式,减少网络IO的时间.安装Snappy和LZO压缩编码器
(1)map输入端:主要考虑数据量大小和切片,支持切片的有Bzip2和LZO(需要创建索引)
(2)map输出端主要考虑速度,速度快的有Snappy和LZO
(3)reduce输出端主要看具体需求,例如作为下一个mr输入需要考虑切片;永久保存的可以压缩比率比较大的gzip
4)整体
(1)NodeManager默认内存8G,需要根据服务器实际配置灵活调整,例如128G内存,配置为100G左右
yarn.nodemanager.resource.memory-mb
(2)单容器默认内存8G,需要根据该任务的数据量灵活调整,例如128M数据,配置1G内存
yarn.scheduler.maximum-allocation-mb
(3)控制分配给MapTask内存上限,如果超过会Kill掉进程.默认内存大小为1G,如果数据是128M,正常不需要调整内存;如果数据量大于128M,可以增加MapTask内存,最大可以增加到4~5G
mapreduce.map.memory.mb
(4)控制分配给RedceTask内存上限,如果超过会Kill掉进程.默认内存大小为1G,如果数据是128M,正常不需要调整内存;如果数据量大于128M,可以增加MapTask内存,最大可以增加到4~5G
mapreduce.reduce.memory.mb
(5)控制MapTask堆内存大小(内存不够经典OOM)
mapreduce.map.java.opts
(6)控制ReduceTask堆内存大小
mapreduce.reduce.java.opts
(7)可以增加MapTask的CPU核数,增加ReduceTask的CPU核数
mapreduce.map.cpu.vcores
mapreduce.reduce.cpu.vcores
(8)增加每个Container的CPU核数和内存大小
(9)在hdfs-site.xml文件中配置多目录(多磁盘)