前言
公司有日志排序的需求,目前收集环节会产生大量小文件,目前我们没有使用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博客