hadoop在使用中的常用优化手段

一、前言

我们知道影响MapReduce运算的因素很多,主要是机器性能、网络、磁盘读写速度、I/O 操作等等有关。

机器的问题属于外部因素,那么下面主要是介绍关于IO操作引发的性能问题:

主要是有几个以下方面

(1)数据倾斜 - 重点

(2)map和reduce数设置不合理

(3)map运行时间太长,导致reduce等待过久

(4)小文件过多 - 重点

(5)大量的不可分块的超大文件

(6)spill次数过多

(7)merge次数过多。

​ MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。

下面想讲解小文件的处理方式:

1.1 HDFS小文件优化

HDFS上每个文件都要在namenode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用namenode的内存空间,另一方面就是索引文件过大是的索引速度变慢。

解决方案

1)Hadoop Archive:

是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样就减少了namenode的内存使用。

1564667225107

2)Sequence file:

sequence file由一系列的二进制key/value组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件。

3)CombineFileInputFormat:

CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。(之前hadoop相关的章节讲解道,可以翻翻看看)

4)开启JVM重用

对于大量小文件Job,可以开启JVM重用会减少45%运行时间。

JVM重用理解:一个map运行一个jvm,重用的话,在一个map在jvm上运行完毕后,jvm继续运行其他map。

具体设置:mapreduce.job.jvm.numtasks值在10-20之间。

1.2 分阶段优化

数据输入阶段

(1)合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致mr运行较慢。

(2)采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景。

数据传输阶段

1)采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZO压缩编码器。

2)使用SequenceFile二进制文件。

进入Map阶段

1)减少溢写(spill)次数:通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill次数,从而减少磁盘IO。

2)减少合并(merge)次数:通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间。

3)在map之后,不影响业务逻辑前提下,先进行combine处理,减少 I/O。

进入Reduce阶段

暂无

数据倾斜

暂无总结

常用参数哟花

暂无

如果你感觉文章对你又些许感悟,你可以支持我!!
-------------本文结束感谢您的阅读-------------