Mapreduce 程序效率的瓶颈在于:
CPU、内存、磁盘、网络
MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题、常用的调优参数。
数据输入:合并小文件,采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景
Map阶段:减少溢写(spill)次数、减少合并(merge)次数、不影响业务逻辑前提下,进行combine处理,减少 I/O
Reduce阶段:合理设置map和reduce数
太少,会导致task等待,延长处理时间;太多,会导致 map、reduce任务间竞争资源,造成处理超时等错误
Map数:由输入的文件总个数,文件的大小,块大小
reduce数:配置设置,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题
IO传输:
输入文件压缩时可以Lzo,snappy适用于 Map -> Reduce 作为中间数据的压缩格式
数据倾斜问题:map端局部聚合Combine、采用Map Join,尽量避免Reduce Join
常用的调优参数:
mapreduce.task.io.sort.mb shuffle的环形缓冲区大小,默认100m
mapreduce.map.sort.spill.percent 环形缓冲区溢出的阈值,默认80%