hadoop里支持许多压缩算法。压缩的好处主要有两点:1.减少了文件占用的存储空间,原来上T的文件可能压缩完以后只需要两三百G的空间即可;2.文件的体积小了以后,数据传输的速度自然就快了。在现在的大数据环境下,这两点显得更加重要。所以现在hdfs文件系统上存的文件,如果数据量大到一定程度,都需要经过压缩处理。

hadoop上常用的压缩格式包括gzip,lzo,snappy,bzip2。以下我们对这四种压缩算法做个对比。

1.gzip

优点:压缩比高,压缩解压的速度也比较快。hadoop本身就支持,自带相关处理gzip文件的jar包。换句话说,你可以像处理普通的文本文件一样处理gzip压缩文件。

缺点:不支持split。这个就很要命了,不支持split,那就意味着无论多大的gzip文件,hadoop在处理的时候都只分配一个mapper给这个文件。这显然是不行的。

应用场景:当每个文件压缩之后都在128M以内时,都可以考虑gzip。(因为hadoop默认的是给128M分配一个mapper)不过这条件,实在是太蛋疼。。。所以本博主工作这么些年,从来没有在hdfs上见过gzip的压缩文件。。。

2.lzo

优点:合理的压缩比,压缩解压速度也比较快。最最最重要的是,支持split,所以本博主工作这么些年,hdfs上的文件,一般都采用lzo压缩。

缺点:压缩比相对gzip第一点。但是相比能split这一点,基本可以忽略。hadoop本身没有自带lzo,需要再安装lzo相关的库。在实际使用时,需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个文件滴。另外在写mr相关代码时,需要setInputFormatClass(LzoTextInputFormat.class);

应用场景:hadoop上最流行的压缩格式。本博主实战中接触到的压缩格式都是用的他。

3.snappy压缩

优点:合理的压缩比,高速压缩速度,支持hadoop native库

缺点:不支持split,压缩比低于gzip。也需要安装

应用场景:好吧,本博主没用过这种。暂时不太清楚。

4.bzip2压缩

优点:支持split,很高的压缩比,比gzip还高。hadoop本身也支持

缺点:压缩/解压速度慢。这个就比较吃亏了,因为压缩是很耗cpu的操作,如果用他的话集群资源就全被他占了,所以一般实际中用lzo而不用他。

应用场景:肯定就是对压缩比要求很高,但对速度要求不是那么苛刻的场合了。

<link href="" rel="stylesheet">
            </div>