MapReduce跑的慢的原因:
- 计算机性能:CPU、内存、磁盘健康、网络。
- I/O操作优化:数据倾斜、Map和Reduce设置不合理、Map运行时间太长导致Reduce等待过久、小文件过多、大量的不可分块的超大文件、溢写次数过多、合并过多。
MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。
数据输入
- 合并小文件:在执行MapReduce任务前将小文件进行合并,大量的小文件会产生大量的Map任务,增大Map任务装载次数。而任务的装载比较耗时,从而导致MapReduce运行较慢。
- 采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景。
Map阶段
- 减少溢写(Spill)次数,通过调整io.sort.mb和sort.spill.percent参数值,增大触发溢写的内存上限,减少溢写次数,从而减少磁盘I/O。
- 减少合并(Merge)次数,通过调整io.sort.factor参数,增大合并的文件数目,减少合并的次数,从而缩短处理时间。
- 在Map之后,不影响业务逻辑前提下,先进行Combiner处理,减少I/O。
Reduce阶段
- 合理设置Map和Reduce数:太少会导致Task等待,延长处理时间;太多会导致任务间竞争资源,造成处理超时等错误。
- 设置Map和Reduce共存:调整slowstart.completemaps参数,使Map运行到一定程度后,Reduce也可以开始运行,减少Reduce的等待时间。
- 避免使用Reduce,因为Reduce在用于连接数据集的时候,将会产生大量的网络消耗。
- 合理设置Reduce端的Buffer:默认情况下,数据达到一个阈值的时候,Buffer中的数据就会写入磁盘,然后Reduce会从磁盘中