hadoop的企业优化
前言:
mapreduce程序的效率的瓶颈在于两点:
计算机性能: cpu、内存、磁盘健康、网络 i/o操作:
数据倾斜
map和reduce数量设置不合理
map的运行时间太长,导致reduc的等待过久
小文件过多
大量的补课分块的超大文件
spill(溢写)次数过多
merge(合并)次数过多
mapreduce优化方法
数据输入:
(1)合并小文件:在执行任务前将小文件进行合并
(2)采用combinetextinputformat来作为输入,解决输入端大量小文件的场景。将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 maptask。
combinetextinputformat.setmaxinputsplitsize(job, 4194304);// 4m
combinetextinputformat.setmininputsplitsize(job, 2097152);// 2m
job.setinputformatclass(combinetextinputformat.class)
map阶段:
(1)减少溢写(spill)操作:通过调整 io.sort.mb 及 sort.spill.percent 参数值,增大触发spill 的内存上限,减少 spill 次数,从而减少磁盘 io。
(2)减少合并(merge)操作:通过调整 io.sort.factor 参数,增大 merge 的文件数目,减少 merge 的次数,从而缩短 mr 处理时间。
(3)在不影响业务逻辑的前提下,先进行combine处理,减少i/o。
reduce阶段:
(1)合理设置map和reduce的数量
(2)设置map、reduce共存:调整 slowstart.completedmaps 参数,使 map 运行到一定程度后,reduce 也开始运行,减少reduce 的等待时间。
(3)规避使用reduce
(4)合理使用reduce端的buffer
i/o传输:
(1)采用数据压缩的方法,减少网络io时间
(2)使用sequencefile二进制文件
数据倾斜问题:
(1)抽样和范围分区
(2)自定义分区
(3)combine
(4)采用map join,尽量避免reduce join
jvm重用:
对于大量的小文件job,开启jvm重用会减少45%运行时间。
具体设置:mapreduce.job.jvm.numtasks 值在 10-20 之间。