前言
公司有日志排序的需求,目前收集环节会产生大量小文件,目前我们没有使用flume和Hbase,本次优化只涉及HDFS和MapReduce。
关于小文件对Namenode影响,本文不涉及,我们现在使用HAR归档小文件。
本文的结论基于HDFS大量小文件的情况。
一 、开启Jvm重用对Job影响:
文件数 |
文件大小 |
JVM重用 |
耗时 |
Jobid |
4815 |
7.54 GB |
Y |
26mins, 5sec |
job_201202211018_0034 |
N |
51mins, 49sec |
job_201202211018_0044 |
结论:对于大量小文件Job,开启JVM重用减少50%运行时间
二、Map压缩对Job影响(开启JVM重用)
2.1大量小文件情况
文件数 |
文件大小 |
压缩Map输出 |
耗时 |
Jobid |
4815
|
7.54 GB |
gz |
38mins, 38sec |
job_201202211018_0034 |
— |
27mins, 26sec |
job_201202211018_0031 |
||
lzo |
27mins, 17sec |
job_201202211018_0036 |
2.2每个文件140MB情况:
文件数 |
文件大小 |
压缩Map输出 |
耗时 |
Jobid |
48(合并小文件)
|
7.54 GB |
gz |
29mins, 37sec |
job_201202211018_0039 |
— |
24mins, 32sec |
job_201202211018_0042 |
||
lzo |
19mins, 18sec |
job_201202211018_0040 |
结论:
- 对于大量小文件Job,使用lzo压缩可以比gz压缩减少28%运行时间。
- 平均140MB输入文件的 Job比大量小文件Job减少30%的时间(jvm重用、map输出lzo)
三、 参数mapred.reduce.parallel.copies
任务时间 |
mapred.reduce.parallel.copies |
54mins, 21sec |
5(默认值) |
45mins, 30sec |
20 |
结论:通过配置参数mapred.reduce.parallel.copies可以提升16%性能
四、 总结
优化项 |
优化方法 |
可以减少Job时间 |
Jvm重用 |
开启jvm重用 |
50% |
mapred.reduce.parallel.copies |
默认值为5,优化值20 |
16% |
Map输出LZO格式 |
默认输出为gz,修改为lzo |
28% |
合并小文件 |
合并小文件 |
30% |
--本文来自heipark iteye博客