前言:

随着数据规模的增大,集群存储的成本也随着增加,数十 PB 到百 PB 级别大集群存储空间治理成为公司基础设施部门的重中之重。另一方面,在Hadoop中,文件需要存储、传输、读取磁盘、写入磁盘等等操作,而文件的大小,直接决定了这些操作的速度。目前hdfs集群有多种存储压缩方式:gzip、bzip2、lzo、lz4、snappy等,下面介绍具体的压缩方式的对比

 

压缩方式对比

整体对比如下图:

压缩格式

split

native

压缩率

速度

是否hadoop自带

linux命令

换成压缩格式后,原来的应用程序是否要修改

gzip



很高

比较快

是,直接使用


和文本处理一样,不需要修改

lzo



比较高

很快

否,需要安装


需要建索引,还需要指定输入格式

snappy



比较高

很快

否,需要安装

没有

和文本处理一样,不需要修改

bzip2



最高


是,直接使用


和文本处理一样,不需要修改

 

A. gzip压缩

优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带gzip命令,使用方便。

缺点:不支持split。

应用场景:当每个文件压缩之后在130M以内的(1个块大小内),都可以考虑用gzip压缩格式。譬如说一天或者一个小时的日志压缩成一个gzip 文件,运行mapreduce程序的时候通过多个gzip文件达到并发。hive程序,streaming程序,和java写的mapreduce程序完 全和文本处理一样,压缩之后原来的程序不需要做任何修改。

B. lzo压缩

优点:压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;可以在linux系统下安装lzop命令,使用方便。

缺点:压缩率比gzip要低一些;hadoop本身不支持,需要安装;在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式)。

应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越越明显。

C. snappy压缩

优点:高速压缩速度和合理的压缩率;支持hadoop native库。

缺点:不支持split;压缩率比gzip要低;hadoop本身不支持,需要安装;linux系统下没有对应的命令。

应用场景:当mapreduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据的压缩格式;或者作为一个mapreduce作业的输出和另外一个mapreduce作业的输入。

D. bzip2压缩

优点:支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便。

缺点:压缩/解压速度慢;不支持native。

应用场景:适合对速度要求不高,但需要较高的压缩率的时候,可以作为mapreduce作业的输出格式;或者输出之后的数据比较大,处理之后的数据 需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需要支持split,而且兼容之前的应用程 序(即应用程序不需要修改)的情况。

说明:

 

压缩性能

压缩比:

hadoop zlib 压缩等级 hadoop常用压缩算法对比_hadoop

压缩速度(压缩/解压时间):

hadoop zlib 压缩等级 hadoop常用压缩算法对比_hadoop zlib 压缩等级_02

可以看出,压缩比越高,压缩时间越长,压缩比:Snappy<LZ4<LZO<GZIP<BZIP2

 

总结

不同的场景选择不同的压缩方式,肯定没有一个一劳永逸的方法,如果选择高压缩比,那么对于cpu的性能要求要高,同时压缩、解压时间耗费也多;选择压缩比低的,对于磁盘io、网络io的时间要多,空间占据要多;对于支持分割的,可以实现并行处理。若该压缩格式不支持文件分割,则后续无法实现并行处理,生产优化核心是让每个文件大小略微低于块大小,如块128M文件怎样为125M。另外未压缩的文件是支持文件分割的,  如果数据已经以压缩的格式存储,则不需要再压缩,如jpeg。