[Hadoop学习笔记]调优

[Hadoop学习笔记]调优_第1张图片

MapReduce 优化从6个方面考虑:

  • 数据输入: 大量小文件问题
  • Map阶段: Shuffle过程(尤其是溢写)
  • Reduce阶段: 个数设置不合理
  • IO阶段
  • 数据倾斜
  • 常用的调优参数
1.合并小文件

在执行MR任务之前将小文件合并。大量的小文件会增加Map任务个数,大量的Map任务会增加装载次数,Map任务装载比较耗时,从而影响MapReduce的效率.
解决方案: 采用CombineTextInputFormat作为输入,解决输入端大量小文件的问题

2.Map阶段优化

(1) 减少溢写次数:设置io.sort.mb调大缓冲区内存,设置sort.spill.percent 调大溢写比。
(2) 减少归并次数: 归并阶段并不是等待所有文件写完一次性归并的, 而2是根据设置的参数,比如5个文件归并一次,如果归并频率很高那么势必会影响Map效率,所以可以通过设置io.sort.factor参数,调大归并的文件数.
(3) 在Map之后,在不影响业务逻辑的进行Combine操作,在Map本地进行一次合并,减少IO和网络传输。

3.Reduce阶段

(1) Map和Reduce个数.map和reduce不能太多也不能太少,太少会造成task等待,太多会造成竞争资源,造成处理超时等错误.
(2) 设置Map和Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度,reduce也开始运行,减少Reduce等待时间
(3) 规避使用Reduce: 减少网络消耗
(4) 合理设置Reduce端的Buffer: 当reduce端reduce任务之前 先要处理的来自Map的数据(归并、分组),当数据达到一定阈值(mapred.job.reduce.input.percent,默认为0)需要把数据写入磁盘,reduce任务再去读取磁盘上的数据,否则直接把内存中的数据送往reduce;因此可以调大该阈值减少磁盘io,但也会增大内存的使用,需要根据情况调整.

4.IO阶段

(1)采用数据压缩的方式,减少网络IO的时间。安装snappy和LZO压缩编码器.
(2) 使用SequenceFile二进制文件.(数据紧凑)

5.数据倾斜问题

数据频率倾斜:数据量差异大
数据大小倾斜:数据值差异大
解决方案:
(1) 对原始数据抽样,根据抽样结果预设分区边界值
(2) 基于对数据集的认识自定义分区
(3) Combine.(比如 wordcount中 key=a的比较多 先进行合并)
(4) 尽量采用Map Join,尽量避免Reduce Join

6. 常用参数设置
7. 小文件处理

小文件弊端: 产生大量的索引文件,占用NameNode内存空间,索引文件过大使得索引速度变慢

解决方案:
(1) 采集阶段,小文件合并成大文件后再上传到HDFS

Hadoop Archive : HDFS存档工具,将多个小文件打包成HAR文件,减少NameNode 内存使用
SequenceFile : 由一系列key/value组成,如果key为文件名,value为文件内容,可以将大批小文件合并成一个大文件

(2) 业务处理之前:使用MapReduce 程序对小文件合并。
(3) 在MapReduce处理时,采用CombineFileInputFormat提高效率

将多个文件合并成一个单独的split,还会考虑数据存储位置

(4) 开启JVM重用:

对于大量小文件job,开启jvm重用会减少45%运行时间
jvm重用原理: 一个Map运行在一个Jvms上,开启重用的话,该map在该jvm运行完毕后,jvm继续运行其他Map
设置 mapreduce.job.jvm.numtasks值在10-20之间

你可能感兴趣的:(hadoop)