MapReduce 优化方法主要从六个方面考虑:数据输入、Map 阶段、Reduce 阶段、IO 传输、数据倾斜问题和常用的调优参数。
6.2.1数据输入
(1)合并小文件:在执行 mr 任务前将小文件进行合并,大量的小文件会产生大量的
map 任务,增大 map 任务装载次数,而任务的装载比较耗时,从而导致 mr 运行较慢。
(2)采用 CombineTextInputFormat 来作为输入,解决输入端大量小文件场景。
6.2.2Map 阶段
1)减少溢写(spill)次数:通过调整 io.sort.mb 及 sort.spill.percent 参数值,增大触发
spill 的内存上限,减少 spill 次数,从而减少磁盘 IO。
2)减少合并(merge)次数:通过调整 io.sort.factor 参数,增大 merge 的文件数目,减少 merge 的次数,从而缩短 mr 处理时间。
3)在 map 之后,不影响业务逻辑前提下,先进行 combine 处理,减少 I/O。
6.2.3Reduce 阶段
1)合理设置 map 和 reduce 数:两个都不能设置太少,也不能设置太多。太少,会导
致 task 等待,延长处理时间;太多,会导致 map、reduce 任务间竞争资源,造成处理超时等错误。
2)设置 map、reduce 共存:调整 slowstart.completedmaps 参数,使 map 运行到一定程
度后,reduce 也开始运行,减少reduce 的等待时间。
3)规避使用 reduce:因为 reduce 在用于连接数据集的时候将会产生大量的网络消耗。
4)合理设置 reduce 端的 buffer:默认情况下,数据达到一个阈值的时候,buffer 中的数据就会写入磁盘,然后 reduce 会从磁盘中获得所有的数据。也就是说,buffer 和 reduce
是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得 buffer 中的一部分数据可以直接输送到 reduce,从而减少 IO 开销: mapred.job.reduce.in