Linux环境下设置Hadoop数据压缩
一 环境准备与编解码器安装
- 在 Linux 节点安装所需压缩库(以 Snappy 为例):
- Debian/Ubuntu:sudo apt-get install -y libsnappy-dev
- CentOS/RHEL:sudo yum install -y snappy-devel
- 验证本机可用的原生压缩库(Hadoop 自带工具):
- hadoop checknative -a
- 若输出中 Snappy 为 true,表示库可用;若为 false,需检查库路径、位数匹配(如 x86_64)、环境变量(LD_LIBRARY_PATH)与重启相关进程。
二 配置Hadoop启用压缩
- 编辑 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.Lz4Codec
</value>
</property>
</configuration>
- 编辑 mapred-site.xml,开启 Map 输出与作业最终输出的压缩(示例用 Snappy):
<configuration>
<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>
<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>
- 如集群使用 Hive/Spark,可叠加存储层压缩(如 ORC/Parquet 的 Snappy)以减少存储与 I/O。
三 命令行与作业中的使用示例
- 命令行一次性压缩输出(将本地文件处理后写入 HDFS 并压缩为 Snappy):
- 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.snappy
- 说明:Hadoop 会根据文件扩展名与编解码器自动完成压缩/解压,多数场景下无需手动解压即可参与后续计算。
四 常用压缩格式选择建议
- Snappy:压缩/解压速度快、CPU 开销低、压缩比中等;适合 shuffle 与 最终输出 的通用场景。
- Gzip:压缩比高、速度较慢;适合对存储空间敏感、后续不常随机读的结果归档。
- Bzip2:压缩比最高、速度最慢,但支持 可分割(splittable);适合大文件离线归档与批处理输入。
- LZO:需额外索引才支持 splittable;适合大表存储与查询加速(需建索引)。
- Lz4:极快、压缩比低;适合极致 shuffle 性能场景。
五 常见问题与排查
- 启用后仍报 Codec 不可用:运行 hadoop checknative -a 确认库加载;检查 LD_LIBRARY_PATH、库版本与 Hadoop 进程是否重启。
- 压缩后作业变慢:优先使用 Snappy/Lz4 做中间压缩;最终结果再按存储/带宽需求选 Gzip/Bzip2。
- 压缩文件不可分片导致并发差:避免将 Gzip 作为大表输入;选择 Bzip2/LZO(建索引) 或将输入转换为 ORC/Parquet 等列式格式。
- 是否需要重启服务:修改 core-site.xml/mapred-site.xml 后,需重启 HDFS/YARN 相关进程(如 NameNode、DataNode、ResourceManager、NodeManager)以生效。