温馨提示×

Ubuntu HDFS数据如何压缩

小樊
32
2025-12-08 22:18:01
栏目: 智能运维

Ubuntu上HDFS数据压缩实操指南

一 常用压缩格式与适用场景

  • Gzip:通用、压缩/解压速度中等、压缩率中等;适合一次性落地与归档。
  • Bzip2:压缩率高,但速度慢;适合对存储节省要求高、可接受较长处理时间的场景。
  • LZO:压缩率与速度折中,支持索引以便较快随机访问(需额外索引/许可);适合频繁读取的大数据。
  • Snappy:压缩/解压速度快,压缩率一般;适合高吞吐计算与交互式查询。
  • Zstandard(Zstd):压缩率与速度兼顾,较新;适合在存储与性能间寻求平衡的场景。

二 前置检查与集群配置

  • core-site.xml 中注册需要的编解码器(确保集群节点均可用相应库):
<configuration>
  <property>
    <name>io.compression.codecs</name>
    <value>
      org.apache.hadoop.io.compress.GzipCodec,
      org.apache.hadoop.io.compress.DefaultCodec,
      org.apache.hadoop.io.compress.BZip2Codec,
      org.apache.hadoop.io.compress.SnappyCodec,
      org.apache.hadoop.io.compress.ZstdCodec
    </value>
  </property>
</configuration>
  • mapred-site.xml 中启用常用压缩(按需调整):
<configuration>
  <!-- Map输出压缩 -->
  <property>
    <name>mapreduce.map.output.compress</name>
    <value>true</value>
  </property>
  <property>
    <name>mapreduce.map.output.compress.codec</name>
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>
  </property>
  <!-- Reduce输出压缩 -->
  <property>
    <name>mapreduce.output.fileoutputformat.compress</name>
    <value>true</value>
  </property>
  <property>
    <name>mapreduce.output.fileoutputformat.compress.codec</name>
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>
  </property>
</configuration>
  • 如使用 Gzip 并希望调整压缩级别,可在 core-site.xml 增加(可选):
<property>
  <name>io.compression.codec.gzip.level</name>
  <value>6</value>
</property>
  • 验证编解码器可用性(任一节点执行):
    • 查看 Snappy:hadoop checknative -a | grep snappy
    • 查看 Zstd:hadoop checknative -a | grep zstd
    • 若无输出,需在集群各节点安装相应本地库(如 libsnappy、libzstd)并重启相关服务。

三 三种常用压缩方式

  • 方式一 预压缩后上传

    • 本地压缩并上传:
      • Gzip:gzip input_file → hadoop fs -put input_file.gz /path/in/hdfs
      • 读取:hadoop fs -cat /path/in/hdfs/input_file.gz | gunzip
    • 说明:简单通用,Hadoop 读取常见压缩文件(如 Gzip/Bzip2/Snappy)时通常可自动解压;适合批处理与归档。
  • 方式二 作业内启用压缩(MapReduce 示例)

    • 在驱动中设置(示例为 Snappy):
Configuration conf = new Configuration();
conf.setBoolean("mapreduce.output.fileoutputformat.compress", true);
conf.set("mapreduce.output.fileoutputformat.compress.codec",
         "org.apache.hadoop.io.compress.SnappyCodec");
Job job = Job.getInstance(conf);
// ... 其他作业配置
  • 或在命令行提交作业时传入:

    • hadoop jar your-job.jar YourMainClass
      -D mapreduce.output.fileoutputformat.compress=true
      -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
      -input /input -output /output
  • 方式三 使用列式格式自带的压缩(推荐用于分析场景)

    • Hive(ORC 使用 Snappy):
CREATE TABLE my_table (
  id INT,
  name STRING
)
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");
  • Spark(Parquet 使用 Snappy):
df.write
  .mode("overwrite")
  .option("compression", "snappy")
  .parquet("/hdfs/path/to/dest")
  • 说明:ORC/Parquet 原生支持压缩与谓词下推,通常比文本格式更高效。

四 小文件与存储优化

  • 大量小文件会显著增加 NameNode 内存压力(每个块元数据常驻内存)。可用 HAR(Hadoop Archive) 归档合并:
    • 归档:hadoop archive -archiveName myhar.har -p /user/ubuntu /user/my
    • 查看:hdfs dfs -ls har:///user/my/myhar.har
    • 解包:hdfs dfs -cp har:///user/my/my.har /user/your
  • 列式格式(如 ORC/Parquet)配合压缩,可在保持查询性能的同时降低存储占用。

五 快速选择建议

  • 追求写入/读取吞吐与通用性:选 Snappy(或 LZO,若需索引/更快随机访问)。
  • 追求最高压缩率、可接受较慢速度:选 Bzip2(适合冷数据归档)。
  • 通用归档与兼容性:选 Gzip
  • 在存储与性能间平衡且需更好压缩:选 Zstd(需集群具备相应本地库)。

0