在shuffle阶段,可以看到数据通过大量的拷贝,从map阶段输出的数据,都要通过网络拷贝,发送到reduce阶段,这一过程中,涉及到大量的网络IO,如果数据能够进行压缩,那么数据的发送量就会少得多。
文件压缩有两大好处,节约磁盘空间,加速数据在网络和磁盘上的传输
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 |
snappy比以上压缩算法都要快。
如何开启压缩:
方式一:在代码中进行设置压缩
在driver里面添加!!!
设置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,修改完成之后记得重启集群