压缩所带来的好处,磁盘、IO,都来带来很多好处,同时也有很多的弊端。
查看自己的hadoop机器是否支持压缩命令 ./hadoop checknatice
如果压缩格式后面全是false,说明Hadoop是没有编译过的。
生产环境经常用的集中压缩 gzip 、 bzip2 、LZO、Snappy
先来看下他们之间的区别,主要体现在压缩比率、压缩与解压速度、是否支持分割等方面
Format extention 压缩比到 是否支持分割
Gzip .gz 40% NO
Bzip2 .bz2 30% yes
LZO .lzo 50% yes if indexed(前提是有索引)
Snappy .snappy 50% NO
而对于我们刚刚说的速度问题,压缩比越高,压缩速度就越慢,成反比,这里就不在列图了。
下面来看下为什么要看是否支持分割呢,我们知道不管是mapreduce还是spark都会有map和reduce还有shuffer的过程,
假如一个1G的文件使用Gzip压缩后,大概是400M左右,执行mapreduce任务时,只有会生成一个task,因为不支持分割。
假如一个1G的文件使用Bzip压缩后,大概是300M左右,执行mapreduce任务时,会按照128M生成3个task,因为支持分割,
就是说压缩后,所有不支持分片的,都只能由一个task去执行。
所以在选择压缩比、压缩时间、是否分割等方面,都要做到权衡。
下面来看下压缩在hadoop的中是用,通过配置就可以了
hadoop中压缩的配置使用
core-site.xml
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
</value>
</property>
MapReduce中mapred-site.xml
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>