HDFS 文件压缩算法

76 阅读2分钟

背景

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核以上)。