这是我参与「第四届青训营 」笔记创作活动的第8天
学习完Hadoop的基础框架知识并且搭建了属于自己的Hadoop集群后,为了提高集群处理任务的效率,我们可以对它进行优化,一下具体叙述下集群效率低的原因和优化方案。
MapReduce程序效率低的原因主要有以下两点:
(1)计算机性能
CPU 、 内存 、 磁盘健康 、 网络
(2)I/O 操作优化
- 数据倾斜
- Map和Reduce数设置不合理
- Map运行时间太长,导致Reduce等待过久
- 小文件过多,导致寻址时间太长
- 大量的不可切片的超大压缩文件
- Spill次数太多
- Merge次数过多
MapReduce优化方法
MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。
1. 数据输入
(1)合并小文件:在执行 MapReduce 任务前将小文件进行合并,大量的小文件会产生大量的Map任务,增大Map任务装载次数,这会耗费大量的时间,从而导致MR运行较慢;
(2)采用CombineTextInputFormat来作为输入,解决输入端大量小文件的场景。
2. Map阶段
(1)减少溢写(Spill)次数:增大触发Spill的内存上限,减少Spill次数,从而减少磁盘I/O;
(2)减少合并(Merge)次数:增大Merge的文件数量,减少Merge的次数,从而缩短MR处理时间;
3. Reduce阶段
(1)合理设置Map和Reduce数:Map和Reduce数如果设置太少,会导致Task等待,延长处理时间;太多,会导致Map、Reduce任务竞争资源,造成处理超时等错误;
(2)设置Map、Reduce共存:使得Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间;
(3)规避使用Reduce:Reduce在用于连接数据集的时候会产生大量的网络消耗;
(4)合理设置Reduce端的Buffer:我们知道Buffer和Reduce是没有直接关联的,因为在默认的情况下,数据达到一个阈值的时候,Buffer中的数据才会写入磁盘,然后Reduce会从磁盘中获取所有的数据。但这中间会涉及到大量的写磁盘->读磁盘操作,所以我们就可以通过参数来配置,使得Buffer中的部分数据直接输送到Reduce。
4. I/O传输
(1)采用数据压缩的方式:减少网络I/O的时间;
(2)使用SequenceFile二进制文件。
5. 数据倾斜问题
5.1 数据倾斜现象
(1)数据频率倾斜:某一个区域的数据量要远远大于其他区域;
(2)数据大小倾斜:部分记录的大小远远大于平均值
5.2 减少数据倾斜的方法
(1)抽样和范围分区
通过对原始数据进行抽样得到的结果集来预设分区边界值;
(2) 自定义分区
基于输出键的背景知识进行自定义分区;
(3) 使用Combiner
使用combine的目的是聚合并精简数据,从而可以大量地减小数据倾斜;
(4) 采用Map Join,尽量避免Reduce Join