MapReduce全过程参数优化

最近花了点时间整理了一下,涵盖了全流程常见实用的调优参数.

希望能有帮助

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文件中配置多目录(多磁盘)

猜你喜欢

转载自blog.csdn.net/zznanyou/article/details/121149005