Hadoop优化
HDFS小文件影响:
- 文件元数据存储在Namenode内存中,大量的小文件就有大量的文件元数据
- 影响计算引擎的任务数量,每个小文件生成一个Map任务
1. 数据输入小文件处理:
- 合并小文件,对小文件进行Har归档;自定义Inputformat将小文件存储成SequenceFile文件
- 采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景
-对于大量的小文件任务,开启JVM重用;将 mapred.job.reuse.jvm.num.tasks 设置成大于1的数,
归属同一job的顺序执行的task可以共享一个JVM
2. Map阶段:
- 增大环形缓冲区大小,默认100M,根据实际情况扩大
- 增大环形缓冲区溢写比例,默认为80%,根据实际情况扩大
- 减少对溢写文件的合并(merge)次数
- 不影响实际业务的前提下,采用 Combiner提前合并,减少IO,(求平均值这种情况不能用,即不影响业务)
- MapTask 增大内存大小、CPU核数
3. Reduce阶段:
- 合理设置Map和Reduce个数
- 设置Map、Reduce共存,调整 slowstart.completedmaps 参数,使Map运行后,Reduce开始运行,减少Reduce等待时间
- 尽量少使用Reduce,因为Reduce连接数据集时回产生大量的网络消耗
- 增加每个Reduce去Map中拿数据的并行数
- 适当增大Reduce端的存储数据内存大小
- 增加ReduceTask的内存大小、CPU核数
4. IO :
- 采用数据压缩的方式,减少网络IO的时间 (snappy & LZOP 安装)
- 使用SequenceFile二进制文件