跳转到内容

Apache Hadoop数据压缩格式

来自代码酷

Hadoop数据压缩格式[编辑 | 编辑源代码]

简介[编辑 | 编辑源代码]

在Hadoop生态系统中,数据压缩格式是指通过特定算法对存储或传输的数据进行压缩编码的技术。压缩能有效减少存储空间占用(通常可降低50%-90%)和网络传输开销,但会增加CPU计算负载。Hadoop支持多种压缩编解码器(codec),每种格式在压缩率、速度和可分片性(Splittable)方面有不同的权衡。

关键特性对比:

  • 压缩率:压缩后数据大小与原数据的比值
  • 压缩/解压速度:算法处理数据的效率
  • 可分片性:是否支持MapReduce作业在压缩文件中间位置拆分处理

主流压缩格式[编辑 | 编辑源代码]

以下是Hadoop生态常用的压缩格式:

压缩格式比较表
格式 扩展名 可分片性 典型应用场景
.gz | 否 | 冷数据存储
.bz2 | 是 | 高压缩比需求
.lzo | 是(需索引) | 实时处理
.snappy | 否 | 中间数据/快速读写
.zst | 是 | 平衡场景

格式详解[编辑 | 编辑源代码]

Gzip[编辑 | 编辑源代码]

DEFLATE算法实现,中等压缩比(约60-70%),解压速度较快但不支持分片。适合存储后较少访问的数据。

# 压缩文件示例
hadoop fs -cat /input/data.txt | gzip | hadoop fs -put - /output/data.gz

Bzip2[编辑 | 编辑源代码]

高压缩比(约50-60%)但速度慢,独特优势是原生支持分片。适合归档存储。

pie title Bzip2压缩时间分布 "压缩" : 65 "解压" : 35

Snappy[编辑 | 编辑源代码]

Google开发的快速压缩(约250MB/s),压缩比一般(约60-70%)。广泛用于中间MapReduce数据。

// 在MapReduce中设置Snappy压缩
Configuration conf = new Configuration();
conf.set("mapreduce.map.output.compress", "true");
conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");

压缩算法选择[编辑 | 编辑源代码]

选择标准可参考以下公式(权衡系数α可根据集群调整):

综合成本=α×存储成本压缩率+(1α)×CPU时间

实际选择建议:

  • 冷数据:Bzip2/Zstandard
  • 热数据:Snappy/LZO
  • ETL管道:分段使用不同压缩(原始→Snappy→Gzip)

性能测试案例[编辑 | 编辑源代码]

使用TPC-DS数据集测试不同格式(10GB文本数据):

测试结果
格式 压缩时间(s) 解压时间(s) 压缩后大小(GB)
- | - | 10.0
142 | 38 | 2.1
21 | 12 | 3.8
315 | 112 | 1.7

最佳实践[编辑 | 编辑源代码]

1. 输入数据:优先使用可分片格式(Bzip2/LZO) 2. 中间数据:使用Snappy等快速格式 3. 输出数据:根据访问频率选择 4. 对ORC/Parquet等列式存储,启用内置压缩(如ZLIB)

-- 在Hive中创建压缩表示例
CREATE TABLE compressed_table (
  id INT,
  name STRING
) STORED AS ORC tblproperties ("orc.compress"="SNAPPY");

常见问题[编辑 | 编辑源代码]

Q:压缩文件如何支持MapReduce分片? A:需满足两个条件: 1. 压缩格式本身支持分片(如Bzip2) 2. 输入格式实现相应逻辑(如TextInputFormat)

Q:压缩会影响数据本地性吗? A:不会。Hadoop会先解压数据再处理,数据块位置仍由HDFS控制。

进阶配置[编辑 | 编辑源代码]

core-site.xml中全局配置:

<property>
  <name>io.compression.codecs</name>
  <value>
    org.apache.hadoop.io.compress.GzipCodec,
    org.apache.hadoop.io.compress.SnappyCodec
  </value>
</property>