在 Debian 上的 Hadoop HDFS 数据压缩实操指南
一 环境准备与编解码器安装
- 安装基础运行环境(若尚未安装):
- 更新索引并安装 Java 11 与 Hadoop:
- sudo apt update
- sudo apt install openjdk-11-jdk hadoop
- 安装常用压缩库(按需选择):
- Snappy:sudo apt install libsnappy-dev
- Gzip:sudo apt install zlib1g-dev
- LZO:sudo apt install liblzo2-dev
- 说明:HDFS 本身不“全局压缩”存储,压缩发生在数据写入阶段(如 MapReduce/Spark 输出、列式格式自带压缩等)。上述库为 Hadoop 进程提供编解码能力。
二 配置 Hadoop 启用压缩
- 在 $HADOOP_HOME/etc/hadoop/core-site.xml 中注册编解码器(示例启用 Snappy 与 Gzip):
-
io.compression.codecs
org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.GzipCodec
- 在 $HADOOP_HOME/etc/hadoop/mapred-site.xml 中开启作业压缩(Map 与 Reduce 输出):
-
mapreduce.map.output.compress
true
-
mapreduce.map.output.compress.codec
org.apache.hadoop.io.compress.SnappyCodec
-
mapreduce.output.fileoutputformat.compress
true
-
mapreduce.output.fileoutputformat.compress.codec
org.apache.hadoop.io.compress.SnappyCodec
- 可选:为 Gzip 设置压缩级别(1–9,默认通常为 6):
-
io.compression.codec.gzip.level
6
- 使配置生效(按你的部署方式重启相应服务,示例命令):
- sudo systemctl restart hadoop-namenode
- sudo systemctl restart hadoop-datanode
- sudo systemctl restart hadoop-resourcemanager
- sudo systemctl restart hadoop-nodemanager
三 在作业与存储中启用压缩
- MapReduce 作业输出压缩(Java API 示例):
- Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, SnappyCodec.class);
- 命令行直接写入压缩文件(使用 Hadoop 提供的本地压缩库):
- hadoop org.apache.hadoop.io.compress.GzipCodec -out /user/hadoop/out.gz < /local/file
- 列式存储(推荐):将输出写为 Parquet/ORC,并启用其内置压缩(如 Snappy/Zstd),可在建表/写入时指定,查询引擎会自动解压,兼顾压缩率与扫描性能。
四 压缩格式选择与分片影响
| 编解码器 |
压缩/解压速度 |
压缩比 |
分片支持 |
典型场景 |
| Gzip |
中 |
中-高 |
否 |
通用、兼容性要求高 |
| Bzip2 |
慢 |
高 |
是 |
归档、极致压缩 |
| LZO |
快 |
中 |
是(需索引) |
大文件、需并行切分 |
| Snappy |
快 |
中 |
否 |
中间结果、低延迟 |
| Zstandard |
快 |
中-高 |
视实现而定 |
新项目、性能与压缩比平衡 |
- 要点:
- 需要 MapReduce 对大文件进行可切分并行处理时,选择支持切分的格式(如 Bzip2、LZO(需建索引));若使用 Snappy/Gzip,通常按块边界切分,单个压缩文件不会跨多个 split 并行。
- 中间 shuffle 数据建议用 Snappy(速度快、开销低);最终落地若追求压缩率可用 Gzip/Bzip2,若追求查询/读取性能优先 Snappy/Zstd。
五 验证与常见问题
- 验证方法:
- 作业完成后检查输出文件后缀与大小:hadoop fs -ls /user/hadoop;若使用 Snappy,常见为 .snappy;Gzip 为 .gz。
- 读取验证:hadoop fs -cat /user/hadoop/out.snappy | head(能正常解压即表明编解码器可用)。
- 常见问题与排查:
- 出现 ClassNotFoundException/NoClassDefFoundError:说明对应编解码器库未安装或未在 io.compression.codecs 中注册,安装库并修正配置后重启服务。
- 压缩后作业无法切分或并发下降:多因使用 Gzip/Snappy 等不支持切分的压缩;改用 Bzip2 或为 LZO 建立索引。
- 性能不达预期:结合数据特征调整 dfs.blocksize(如 128MB/256MB)、合理设置副本数与并发线程,必要时选用 Zstd/Snappy 并配合列式格式。