HDFS支持多种压缩格式(如Gzip、Snappy、LZO、Zstandard等),需根据需求安装对应的Linux工具包。以Ubuntu为例,常用命令如下:
gzip命令。sudo apt-get update
sudo apt-get install libsnappy-dev snappy-tools
lzo-devel和lzop工具(需手动编译LZO库):sudo apt-get install lzo-dev lzop
sudo apt-get install zstd
确保Hadoop集群所有节点均安装对应工具,避免压缩/解压时出现兼容性问题。
需修改Hadoop核心配置文件(位于$HADOOP_HOME/etc/hadoop/目录),启用HDFS对压缩的支持:
core-site.xml配置Hadoop支持的压缩编解码器,指定哪些压缩格式可用于HDFS操作:
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.DefaultCodec</value>
</property>
GzipCodec:支持Gzip格式;SnappyCodec:支持Snappy格式;DefaultCodec:默认压缩格式(无压缩)。hdfs-site.xml调整HDFS块大小(默认128MB),根据压缩率优化存储效率(如压缩后文件较小,可适当减小块大小):
<property>
<name>dfs.blocksize</name>
<value>67108864</value> <!-- 64MB -->
</property>
修改完成后,重启Hadoop集群使配置生效:
$HADOOP_HOME/sbin/stop-dfs.sh
$HADOOP_HOME/sbin/start-dfs.sh
使用Linux命令行工具将本地文件压缩为HDFS支持的格式:
gzip -c /local/path/input.txt > /local/path/input.txt.gz
snappy -c /local/path/input.txt > /local/path/input.txt.snappy
zstd -c /local/path/input.txt > /local/path/input.txt.zst
使用hadoop fs -put命令将本地压缩文件上传至HDFS目标路径:
hadoop fs -put /local/path/input.txt.gz /hdfs/path/destination/
将HDFS中的压缩文件下载至本地,再用Linux工具解压:
hadoop fs -get /hdfs/path/destination/input.txt.gz /local/path/
gzip -d /local/path/input.txt.gz # 解压为input.txt
使用hadoop fs -put的-compress选项,直接将本地未压缩文件上传并压缩到HDFS:
hadoop fs -put -compress snappy /local/path/input.txt /hdfs/path/destination/
此命令会自动将input.txt压缩为Snappy格式并上传至HDFS。
若需在MapReduce作业中压缩中间数据或最终输出,需配置作业参数:
减少Map任务到Reduce任务的中间数据传输量:
Configuration conf = new Configuration();
conf.set("mapreduce.map.output.compress", "true");
conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
压缩Reduce任务的输出结果(如保存到HDFS的文件):
conf.set("mapreduce.output.fileoutputformat.compress", "true");
conf.set("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.GzipCodec");
将配置应用到MapReduce作业(如Java程序)并提交:
Job job = Job.getInstance(conf, "Compressed MapReduce Job");
// 设置其他作业参数(如输入输出路径、Mapper/Reducer类)
System.exit(job.waitForCompletion(true) ? 0 : 1);
检查HDFS中的压缩文件:
hadoop fs -ls /hdfs/path/destination/
输出应显示压缩后的文件(如input.txt.gz、input.txt.snappy)。
查看文件内容:
hadoop fs -cat /hdfs/path/destination/input.txt.gz | gzip -d
hadoop fs -cat /hdfs/path/destination/input.txt.snappy | snappy -d
检查压缩率:
hadoop fs -du -h /hdfs/path/destination/input.txt.gz # 查看压缩后大小
hadoop fs -du -h /local/path/input.txt # 查看原始大小