温馨提示×

Ubuntu Hadoop 怎样进行数据压缩

小樊
32
2025-12-30 12:52:05
栏目: 智能运维

Ubuntu Hadoop 数据压缩实操指南

一 常用压缩格式与选型

  • 压缩在大数据场景可显著减少磁盘/网络 I/O存储空间,但会增加CPU消耗;需在压缩比与速度间权衡。
  • 常见格式对比(压缩比与速度趋势):压缩比(由低到高)一般为:Snappy < LZ4 < LZO < GZIP < BZIP2;解压速度趋势相反(Snappy 最快,BZIP2 最慢)。是否可分割(splittable)直接影响并行度:BZIP2 原生可分割LZO 需建索引后可分割GZIP/Snappy/LZ4 不可分割
  • 典型场景建议:
    • 中间数据(Map 输出/Shuffle):优先Snappy/LZO(速度快,提升吞吐)。
    • 归档/冷数据:优先GZIP/BZIP2(压缩比高,节省存储)。
    • 大文件且需并行处理:选LZO 并建索引BZIP2

二 环境准备与可用编解码器检查

  • 安装系统依赖(示例为 Ubuntu):
    • Snappy:sudo apt-get install -y libsnappy-dev
    • LZO:sudo apt-get install -y liblzo2-2 liblzo2-dev
  • 检查 Hadoop 可用的 native 压缩库:hadoop checknative。若状态为 false,需安装对应 native 库或调整库路径。
  • 在 Hadoop 配置中声明编解码器(core-site.xml)。示例启用常见编解码器:
    <configuration>
      <property>
        <name>io.compression.codecs</name>
        <value>
          org.apache.hadoop.io.compress.SnappyCodec,
          org.apache.hadoop.io.compress.GzipCodec,
          org.apache.hadoop.io.compress.BZip2Codec,
          org.apache.hadoop.io.compress.Lz4Codec,
          com.hadoop.compression.lzo.LzoCodec,
          com.hadoop.compression.lzo.LzopCodec
        </value>
      </property>
    </configuration>
    
    如需使用 LZO,还需添加:io.compression.codec.lzo.class=com.hadoop.compression.lzo.LzoCodec

三 在 MapReduce 中启用压缩

  • 中间数据压缩(Shuffle/Map 输出):
    Configuration conf = new Configuration();
    conf.setBoolean("mapreduce.map.output.compress", true);
    conf.set("mapreduce.map.output.compress.codec",
             "org.apache.hadoop.io.compress.SnappyCodec"); // 或 Lz4Codec
    
  • 作业最终输出压缩:
    conf.setBoolean("mapreduce.output.fileoutputformat.compress", true);
    conf.setString("mapreduce.output.fileoutputformat.compress.codec",
                  "org.apache.hadoop.io.compress.GzipCodec"); // 归档用 Gzip/BZip2
    
  • 命令行临时指定压缩(示例输出为 Snappy):
    hadoop jar your-job.jar \
      -D mapreduce.output.fileoutputformat.compress=true \
      -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec \
      input output
    
  • 验证:查看输出文件大小、作业日志与 hadoop checknative 输出。

四 在 Hive 与 Spark 中使用压缩

  • Hive
    • 中间与最终输出:
      SET hive.exec.compress.output=true;
      SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
      SET mapreduce.map.output.compress=true;
      SET mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
      
    • 存储格式建议:列式格式如 ORC/Parquet 自带压缩与编码(如 ZLIB/SNAPPY),通常无需额外配置;创建表时可指定 STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY")
  • Spark(以 Spark SQL 为例)
    • 写入压缩 Parquet/ORC:
      spark.sql("SET spark.sql.parquet.compression.codec=snappy")
      df.write.mode("overwrite").parquet("hdfs:///path/out")
      
    • Shuffle 压缩:
      -- Spark 3.x
      spark.conf.set("spark.shuffle.compress", "true")
      spark.conf.set("spark.io.compression.codec", "snappy")
      

五 LZO 索引与常见问题处理

  • LZO 分割前提是对文件建立索引,否则按不可分割处理,影响并行度。索引工具与用法示例:
    # 使用 hadoop-lzo 提供的索引工具(需先部署 hadoop-lzo)
    hadoop jar /path/hadoop-lzo.jar com.hadoop.compression.lzo.LzoIndexer /data/file.lzo
    
    建索引后,配合 LzoCodec 与正确的 InputFormat 即可实现分片读取。
  • 常见问题
    • 编解码器不可用:运行 hadoop checknative 排查 native 库;确认 core-site.xml 已正确声明编解码器;必要时在 hadoop-env.sh 中补充 HADOOP_CLASSPATH 指向相关 JAR。
    • 不可分割格式导致并发不足:大文件避免使用 GZIP/Snappy 作为输入;改用 BZIP2LZO(已索引)
    • 性能与资源:压缩提升 I/O 但消耗 CPU;在 CPU 紧张时可改用 LZ4/Snappy,在存储紧张时优先 GZIP/BZIP2

0