MapReduce生产经验
MapReduce程序效率的瓶颈在于两点:
1)计算机性能
(1)CPU、内存、磁盘、网络
2)I/O操作优化
(1)数据倾斜
(2)Map运行时间太长,导致Reduce等待过久
(3)小文件过多
下来就根据这两点瓶颈可以进行适当调优
map端:
1.自定义分区,减少数据倾斜,代码中定义类,继承Partitioner接口,重写getPartition方法
2.减少溢写的次数,mapreduce.task.io.sort.mb,Shuffle的环形缓冲区大小默认100m,可以提高到200m,mapreduce.map.sort.spill.percent,环形缓冲区溢出的阀值默认是80%,可以提高到90%
3.增加Merge合并次数,mapreduce.task.io.sort.factor默认是10,可以提高到20
4.在不影响业务的前提下提前Combiner
5.减少磁盘IO可以采用Snappy压缩
6.Mapreduce.map.memory.mb,默认MapTask内存1g,根据实际情况提高该内存
7.Mapreduce.map.java.opts,控制MapTask堆内存大小,如果内存不够报错oom
8.Mapreduce.map.cpu.vcores,默认MapTask的CPU核数1,如果计算比较密集可以增加CPU核数
9.异常重试,mapreduce.map.maxattempts,每个MapTask最大重试次数,一旦重试次数超过,认为MapTask失败,根据机器性能可以提高
reduce端:
1.mapreduce.reduce.shuffle.parallelcopies,每个Reduce去Map中拉去数据的并行数,默认值是5,可以适当提高
2.Mapreduce.reduce.shuffle.input.buffer.percent,Buffer大小占Reduce可用内存的比例,默认值0.7,可以提高到0.8
3.Mapreduce.reduce.shuffle.merge.percent,Buffer中的数据达到多少比例开始写入磁盘,默认值0.66,可以提高到0.75
4.Maperduce.reduce.memory.mb默认ReduceTask内存上限1g,128m数据对应1g内存原则,适当提高内存到4-6g
5.Mapreduce.reduce.java.opts,控制ReduceTask堆内存大小,和map一样如果内存不够报错oom
6.Mapreduce.reduce.cpu.vcores默认ReduceTask的CPU核数1个,可以提高到2-4个
7.Mapreduce.reduce.maxattempts每个Reduce Task最大重试次数,一旦重拾次数超过认为失败,根据机器性能适当提高
8.Mapreduce.job.reduces.slowstart.completedmaps当MapTask完成的比例达到该值后才会为ReduceTask申请资源。
能不用Reduce尽可能不用