背景
HDFS 文件系统中,有业务部门存放的大量模型训练数据,日志文件等。这些文件往往体积超过1G。会产生大量的文件快,从而对NameNode 内存产生压力,下面介绍几种常见压缩算法以及如何选择,可供参考。
压缩算法
常见压缩算法对比
| 算法 | 压缩速度 | 解压速度 | 压缩比 | 是否可分片(Split) | 适用场景 |
|---|---|---|---|---|---|
| Gzip | 中等 | 中等 | 高 | ❌ 否 | 归档存储,高压缩比需求 |
| Snappy | 快 | 极快 | 低 | ❌ 否 | 实时处理,低延迟场景 |
| LZO | 快 | 快 | 中等 | ✅ 是(需索引) | MapReduce中间数据 |
| Bzip2 | 极慢 | 慢 | 最高 | ✅ 是 | 冷数据存储,极致压缩比需求 |
| Zstd | 快 | 极快 | 高 | ✅ 是(新版本支持) | 平衡压缩比与速度的现代选择 |
性能估算(以1GB文本文件为例)
- Gzip:
- 压缩时间:~30-60秒(依赖CPU性能),压缩比约 4:1(文本文件通常可压缩到25%大小)。
- 解压时间:~20-40秒。
- Snappy:
- 压缩时间:~10-20秒,压缩比约 2:1(压缩后约500MB)。
- 解压时间:~5-10秒(适合迭代计算)。
- Zstd:
- 压缩时间:~15-30秒,压缩比接近Gzip(3.5:1),解压速度与Snappy相当。
注:实际速度取决于Datanode的CPU性能(如核心数、频率)。文本文件(如日志、CSV)压缩效果通常优于二进制文件。
配置建议
压缩算法选择:
| 场景 | 推荐算法 | 理由 |
|---|---|---|
| 冷数据归档 | Gzip/Bzip2 | 高压缩比,节省存储成本 |
| MapReduce中间数据 | Snappy/LZO | 低延迟,可分片(LZO需索引) |
| 实时查询(Hive/Spark) | Zstd/ORC+Snappy | 平衡压缩比与查询性能 |
参数调优:
- 设置
mapreduce.output.fileoutputformat.compress.codec为对应压缩算法。 - 对可分片格式,启用
mapreduce.input.fileinputformat.split.minsize避免过多小分片。
总结与建议
- 优先选择Zstd:在现代Hadoop集群中,Zstd在压缩比、速度和可分片性上表现均衡。
- 避免Gzip用于计算:除非存储成本是首要考虑,否则不可分片的压缩格式会拖慢作业。
- 监控资源:压缩会转移瓶颈从IO到CPU,需确保Datanode的CPU足够(如16核以上)。