Hadoop原生支持多种压缩格式,需根据压缩比、速度、是否支持split等需求选择:
根据选择的格式安装对应库(以Snappy、Gzip为例):
# Debian/Ubuntu
sudo apt-get install libsnappy-dev
# CentOS/RHEL
sudo yum install snappy-devel
# 检查是否安装
gzip --version
# 安装lzo-devel和lzop
sudo yum install lzo-devel lzop
# 编译Hadoop时需开启LZO支持(参考Hadoop官方文档)
修改Hadoop配置文件(位于$HADOOP_HOME/etc/hadoop/),启用压缩功能:
core-site.xml(全局压缩编解码器)<configuration>
<!-- 指定Hadoop支持的压缩编解码器,多个用逗号分隔 -->
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec</value>
</property>
</configuration>
mapred-site.xml(MapReduce作业压缩)<configuration>
<!-- 启用Map输出压缩(减少shuffle数据量) -->
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<!-- Map输出压缩编解码器(推荐Snappy,速度快) -->
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<!-- 启用最终输出压缩(如作业输出到HDFS) -->
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<!-- 最终输出压缩编解码器(如归档选Bzip2,小文件选Gzip) -->
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
</configuration>
hdfs-site.xml(HDFS块大小优化)<configuration>
<!-- 调整块大小(默认128MB),大文件适合更大的块 -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value> <!-- 128MB -->
</property>
<!-- 增加NameNode/Datanode处理线程数(提升并发) -->
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>100</value>
</property>
</configuration>
使配置生效:
# 根据实际服务名调整(如hadoop-namenode、hadoop-datanode等)
sudo systemctl restart hadoop-namenode
sudo systemctl restart hadoop-datanode
sudo systemctl restart hadoop-resourcemanager
sudo systemctl restart hadoop-nodemanager
# 使用Snappy压缩上传本地文件
hadoop fs -put -f -D mapreduce.output.fileoutputformat.compress=true \
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec \
localfile.txt /user/hadoop/output/compressed_snappy/
# 列出HDFS中的压缩文件
hadoop fs -ls /user/hadoop/output/compressed_snappy/
# 下载并解压文件
hadoop fs -get /user/hadoop/output/compressed_snappy/localfile.txt.snappy ./localfile.txt
# 使用gunzip解压(如果是Gzip格式)
gunzip localfile.txt.gz
编写MapReduce程序(如WordCount),在驱动类中设置压缩配置:
Configuration conf = new Configuration();
conf.set("mapreduce.output.fileoutputformat.compress", "true");
conf.set("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
Job job = Job.getInstance(conf, "WordCount");
// 其他配置...
System.exit(job.waitForCompletion(true) ? 0 : 1);
提交作业后,检查输出目录是否生成压缩文件(如.snappy后缀)。
lzopindex命令),并在MapReduce作业中指定LzoTextInputFormat。