文件压缩有两大好处,节约磁盘空间,加速数据在网络和磁盘上的传输
前面hadoop的版本经过重新编译之后,可以看到hadoop已经支持所有的压缩格式了,剩下的问题就是该如何选择使用这些压缩格式来对MapReduce程序进行压缩
可以使用bin/hadoop checknative 来查看编译之后的hadoop支持的各种压缩,如果出现openssl为false,那么就在线安装一下依赖包
bin/hadoop checknative
yum install openssl-devel
hadoop支持的压缩算法
压缩格式
工具
算法
文件扩展名
是否可切分
DEFLATE
无
DEFLATE
.deflate
否
Gzip
gzip
DEFLATE
.gz
否
bzip2
bzip2
bzip2
bz2
是
LZO
lzop
LZO
.lzo
否
LZ4
无
LZ4
.lz4
否
Snappy
无
Snappy
.snappy
否
各种压缩算法对应使用的java类
压缩格式
对应使用的java类
DEFLATE
org.apache.hadoop.io.compress.DeFaultCodec
gzip
org.apache.hadoop.io.compress.GZipCodec
bzip2
org.apache.hadoop.io.compress.BZip2Codec
LZO
com.hadoop.compression.lzo.LzopCodec
LZ4
org.apache.hadoop.io.compress.Lz4Codec
Snappy
org.apache.hadoop.io.compress.SnappyCodec
常见的压缩速率比较
压缩算法
原始文件大小
压缩后的文件大小
压缩速度
解压缩速度
gzip
8.3GB
1.8GB
17.5MB/s
58MB/s
bzip2
8.3GB
1.1GB
2.4MB/s
9.5MB/s
LZO-bset
8.3GB
2GB
4MB/s
60.6MB/s
LZO
8.3GB
2.9GB
49.3MB/S
74.6MB/s
如何开启压缩:
方式一:在代码中进行设置压缩
设置map阶段的压缩 Configuration configuration = new Configuration(); configuration.set("mapreduce.map.output.compress","true"); configuration.set("mapreduce.map.output.compress.codec","org.apache.hadoop.io.compress.SnappyCodec"); 设置reduce阶段的压缩 configuration.set("mapreduce.output.fileoutputformat.compress","true"); configuration.set("mapreduce.output.fileoutputformat.compress.type","RECORD"); configuration.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec");
方式二:配置全局的MapReduce压缩
修改mapred-site.xml配置文件,然后重启集群,以便对所有的mapreduce任务进行压缩
map输出数据进行压缩
<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>
reduce输出数据进行压缩
<property> <name>mapreduce.output.fileoutputformat.compress</name> <value>true</value> </property> <property> <name>mapreduce.output.fileoutputformat.compress.type</name> <value>RECORD</value> </property> <property> <name>mapreduce.output.fileoutputformat.compress.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> </property>
所有节点都要修改mapred-site.xml,修改完成之后记得重启集群
重点:使用hadoop的snappy压缩来对数据进行压缩
第一步:代码中添加配置
这里通过修改代码的方式来实现数据的压缩
map阶段输出压缩配置 Configuration configuration = new Configuration(); configuration.set("mapreduce.map.output.compress","true"); configuration.set("mapreduce.map.output.compress.codec","org.apache.hadoop.io.compress.SnappyCodec"); reduce阶段输出压缩配置 configuration.set("mapreduce.output.fileoutputformat.compress","true"); configuration.set("mapreduce.output.fileoutputformat.compress.type","RECORD");
第二步:重新打包测试mr程序
会发现MR运行之后的输出文件都变成了以.snappy的压缩文件