在 Ubuntu 上使用 HDFS 进行数据压缩的完整操作指南
一 环境准备与编解码器配置
- 在 Ubuntu 上安装 Hadoop 客户端后,确认已安装所需压缩库(以 Snappy 为例):sudo apt-get install libsnappy1。
- 在 Hadoop 配置中注册编解码器,编辑 $HADOOP_HOME/etc/hadoop/core-site.xml,确保包含常用编解码器:
io.compression.codecsorg.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.ZstdCodec。
- 如使用 LZO,需额外安装 LZO 原生库并在 Hadoop 中配置 LzoCodec;如使用 Zstandard,确保 Hadoop 版本包含 ZstdCodec。完成后重启相关服务或重新加载配置。
二 命令行方式压缩与解压
- 方式 A 预压缩后上传:先在本地压缩,再上传到 HDFS。示例:
- 本地压缩:gzip input_file(生成 input_file.gz)
- 上传:hadoop fs -put input_file.gz /hdfs/path/
- 下载解压:hadoop fs -get /hdfs/path/input_file.gz . && gunzip input_file.gz
- 方式 B 写入时压缩(MapReduce 输出):
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount \
-D mapreduce.output.fileoutputformat.compress=true \
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec \
/input /output_snappy
- 读取与验证:
- 查看:hadoop fs -ls /output_snappy
- 内容校验:hadoop fs -cat /output_snappy/part-r-00000 | head
- 说明:Hadoop 能自动识别常见压缩文件(如 .gz、.bz2),直接用 -cat/-get 即可读取或下载。
三 在 MapReduce 与 Spark 中启用压缩
- MapReduce 关键参数(示例为 Snappy):
- 作业输出压缩:
conf.set(“mapreduce.output.fileoutputformat.compress”, “true”);
conf.set(“mapreduce.output.fileoutputformat.compress.codec”, “org.apache.hadoop.io.compress.SnappyCodec”);
- Map 端中间结果压缩(可选,提升 shuffle 性能):
conf.set(“mapreduce.map.output.compress”, “true”);
conf.set(“mapreduce.map.output.compress.codec”, “org.apache.hadoop.io.compress.SnappyCodec”);
- 输入压缩(若输入已压缩):
conf.set(“mapreduce.input.fileinputformat.input.compress”, “true”);
conf.set(“mapreduce.input.fileinputformat.input.compress.codec”, “org.apache.hadoop.io.compress.GzipCodec”);
- Spark 写入压缩(以 Parquet 为例):
df.write.mode(“overwrite”).option(“compression”, “snappy”).parquet(“hdfs:///path/to/dest”)
- 提示:选择 Snappy 或 LZO 可获得更快的编解码速度;Gzip/Bzip2 压缩比更高但速度较慢。
四 在 Hive 与列式格式中启用压缩
- Hive 表存储压缩(ORC 使用 Snappy):
CREATE TABLE my_table (id INT, name STRING)
STORED AS ORC
TBLPROPERTIES (“orc.compress”=“SNAPPY”);
- 列式格式(如 Parquet/ORC)天然支持压缩,结合合适的编解码器(如 SNAPPY/ZSTD)可在存储与查询性能间取得平衡。
五 常见问题与优化建议
- 编解码器不可用:检查 core-site.xml 的 io.compression.codecs 是否包含对应 Codec,并确认节点已安装相应本地库(如 Snappy、LZO、Zstd)。
- 读取失败或不解压:确认文件扩展名与编解码器匹配,或使用通用接口(如 LzoCodec 处理 .lzo)。
- 性能与压缩比权衡:
- 追求速度:选 Snappy/LZO(解压快,适合流式/交互场景)。
- 追求压缩率:选 Gzip/Bzip2(更省存储,但 CPU 与时间开销更高)。
- 综合表现:选 Zstandard(压缩比与速度兼顾,需 Hadoop 版本支持)。
- 存储与计算:结合 Parquet/ORC+压缩 能显著降低存储并提升扫描性能;合理设置 dfs.blocksize 与压缩策略以优化 I/O。