HDFS数据压缩通过选择合适的算法(如Snappy、Gzip等)并安装配置相关工具,可有效节省存储空间并降低网络传输与磁盘I/O压力。压缩可在命令行或MapReduce作业中启用,需验证效果并优化参数以平衡CPU负载与压缩比。
在Hadoop生态中,数据不断累积,存储与计算压力同步增长。实施压缩几乎是必经之路,不仅能够显著节省磁盘空间,还能通过减小数据体积来降低网络传输与磁盘I/O的压力——无论从哪个角度看,收益都十分明确。然而,压缩并非简单的“要压”即可,如何压缩、选用何种算法、在哪个环节执行压缩,均需仔细考量。以下从实操角度,梳理HDFS数据压缩的完整链路。
HDFS原生支持多种主流压缩算法,但具体选择需依据应用场景:追求速度、压缩比,还是兼顾两者。
长期稳定更新的攒劲资源: >>>点此立即查看<<<

选定算法后,需在所有Hadoop节点上安装对应依赖包。以CentOS为例,可通过以下命令完成:
sudo yum install snappy snappy-develsudo yum install lzo lzo-devel(注意,LZO需在编译Hadoop时启用支持)sudo yum install zstd zstd-devel关键提醒:所有节点必须安装齐备相应的工具,否则运行时会引发兼容性问题,排查过程较为繁琐。
core-site.xml(全局压缩设置)该文件管理Hadoop框架支持的编解码器,需将所用算法全部列入:
io.compression.codecs
org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec,org.apache.hadoop.io.compress.ZStandardCodec
io.compression.codec.snappy.class
org.apache.hadoop.io.compress.SnappyCodec
io.compression.codec.default
org.apache.hadoop.io.compress.SnappyCodec
io.compression.codecs:以逗号分隔列出所有支持的编解码器。io.compression.codec.default:可选,设置默认算法,后续未指定时将自动使用。hdfs-site.xml(HDFS特定设置)该文件用于优化HDFS对压缩的支持,关键参数调整如下:
dfs.replication
3
dfs.blocksize
134217728
dfs.namenode.handler.count
100
dfs.datanode.handler.count
100
io.compression.codec.gzip.level
6
注意事项:增大dfs.blocksize可减少压缩后文件数量,提升并行处理效率;增大handler.count则为了应对压缩/解压过程中可能突增的网络请求,避免成为性能瓶颈。
Hadoop自带的hadoop jar命令可方便地对HDFS上的文件进行压缩或解压。
hadoop jar $HADOOP_HOME/share/hadoop/common/hadoop-common-*.jar compress \
-D mapreduce.output.fileoutputformat.compress=true \
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec \
/input/path/file.txt /output/path/file.snappy
hadoop jar $HADOOP_HOME/share/hadoop/common/hadoop-common-*.jar decompress \
/input/path/file.snappy /output/path/file.txt
除jar命令外,管道组合也是实用技巧。例如,对Gzip压缩的文件,可通过管道直接解压并写入目标路径:
hadoop fs -cat /input/path/file.gz | gunzip | hadoop fs -put - /output/path/file.txt
MapReduce作业的压缩可从两个层面配置:Map输出和Reduce输出,两者目的不同,配置也略有差异。
在mapred-site.xml中配置:
mapreduce.map.output.compress
true
mapreduce.map.output.compress.codec
org.apache.hadoop.io.compress.SnappyCodec
同样在mapred-site.xml中配置:
mapreduce.output.fileoutputformat.compress
true
mapreduce.output.fileoutputformat.compress.codec
org.apache.hadoop.io.compress.SnappyCodec
mapreduce.output.fileoutputformat.compress.type
BLOCK
如需在代码中控制所有配置,可使用Java API:
Configuration conf = new Configuration();
conf.set("mapreduce.map.output.compress", "true");
conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
conf.set("mapreduce.output.fileoutputformat.compress", "true");
conf.set("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
conf.set("mapreduce.output.fileoutputformat.compress.type", "BLOCK");
Job job = Job.getInstance(conf, "Compressed MapReduce Job");
// 其他作业配置...
System.exit(job.waitForCompletion(true) 0 : 1);
配置完成后,通过以下方式确认压缩效果:
hdfs dfs -ls /output/path/,若文件后缀为.snappy、.gz等,说明压缩成功。hdfs dfs -du -h /input/path/查看原始大小,再查看输出路径大小,对比即知。hdfs dfsadmin -report,确认Compression Codecs字段包含已配置的算法。压缩虽有效,但需权衡CPU开销。压缩过度易导致CPU成为瓶颈,压缩不足则存储与网络压力不减。以下方向可供参考:
level参数范围为19,数值越高压缩比越好但速度越慢,需找到平衡点。侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述