1 .MapReduce 跑的慢的原因
1.1主要有两点:
- 计算机性能
CPU、内存、磁盘、网络 - IO 操作优化
- 数据倾斜
2)Map 和 Reduce 数目设置不合理
3)Map 时间过长,导致 Reduce 等待太久
4)小文件过多
5)大量的不可分块的超大文件
6)spill(溢写)次数过多
7)Merge 次数过多
1.2 MapReduce 优化方法
- 主要从六个方面考虑:数据输入,Map 阶段、Reduce 阶段、IO传输阶段、数据倾斜问题和参数调优。
1.2.1 数据输入
(1)合并小文件:在执行MR 任务前将小文件进行合并,大量的小文件会产生大量的map 任务,增大 map 任务装载次数,而任务的装在比较耗时,从而导致 mr 运行很慢。
合并小文件的方法:
(1)在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
(2)在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。
(3)在MapReduce处理时,可采用CombineTextInputFormat提高效率。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629221505801.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzNjA5NjAz,size_10,color_FFFFFF,t_30
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629221555685.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzNjA5NjAz,size_16,color_FFFFFF,t_30
)
1.2.2 map阶段
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629221751287.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzNjA5NjAz,size_16,color_FFFFFF,t_30
)
1.2.3 Reduce 阶段
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629221914746.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzNjA5NjAz,size_16,color_FFFFFF,t_30
)
1.2.4 I/O传输
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629222055387.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzNjA5NjAz,size_16,color_FFFFFF,t_30
)
1.2.5 数据倾斜问题
(1)数据倾斜现象
数据频率倾斜: 某一个区域的数据量远远大于其他区域。
数据大小倾斜:部分记录的大小远远大于平均值。
(2)减少数据倾斜的方法
方法 1:抽样和范围分区
对原始数据进行抽样得到结果集,预设分区边界。
方法2 :自定义分区
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629222430705.png
)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629222449789.png
)
方法 4 : Mapjoin,避免 Reduce join.
**mapjoin 的工作机制:**大表join 小表的时候,先把小表放进内存中,就避免了 reduce join 阶段
可分解为两部分:
1、TaskA ,它是一个localTask(在客户端本地执行的Task),负责扫描小表a的数据,将其转换成一个HashTable的数据结构,并写入本地文件中,之后将文件加载到 DistributeCache 中。
2、TaskB ,该任务就是一个没有Reduce 的Mr,启动 MapTask去扫描大表b,在Map 阶段,根据小表 a 的每一条记录去和 DistributeCache 中 大表 b 中的数据做关联,并直接输出结果。
所以MapJoin 没有Reduce.所有由 Map 直接输出文件,有多少个 MapTask ,就有多少个结果文件。
1.2.6 参数调优
![(1)](https://img-blog.csdnimg.cn/20200629222628210.png
)