目前在Hadoop中常用的几种压缩格式:lzo,gzip,snappy,bzip2,主要特性对比如下:

压缩格式

codec类

算法

扩展名

多文件

splitable

native

工具

hadoop自带

deflate

DeflateCodec

deflate

.deflate






gzip

GzipCodec

deflate

.gz




gzip


bzip2

Bzip2Codec

bzip2

.bz2




bzip2


lzo

LzopCodec

lzo

.lzo


是[需建索引]


lzop


snappy

SnappyCodec

snappy

.snappy






其性能对比如下:

压缩格式

压缩比

压缩速率

解压速率

gzip/deflate

13.4%

21 MB/s

118 MB/s

bzip2

13.2% 

2.4MB/s 

 9.5MB/s

lzo

20.5%

135 MB/s

410 MB/s

snappy

22.2%

172 MB/s

409 MB/s

1.所有算法的实现均在org.apache.hadoop.io.compress包下面;如果原始数据已经压缩(jpeg图像),则不建议再压缩

2.deflate压缩:

标准压缩算法,其算法实现是zlib,而gzip文件格式只是在deflate格式上增加了文件头和一个文件尾

3.gzip压缩:

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

不支持split;

因此 ①适用于压缩后的文件大小在120M以内(haoop2的标准block大小是120M)的处理,可以有效提高读的并发,对hive,streaming,Java 等mr程序透明,无需修改原程序②由于gzip拥有较高的压缩比,因此相比于其他压缩算法,更适用于冷数据的存储

4.bzip2压缩

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

压缩/解压速度很慢;
不支持native;

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

4.lzo压缩

压缩/解压速度也比较快,合理的压缩率;

支持split,是hadoop中最流行的压缩格式(需要建索引,文件修改后需要重新建索引);

支持hadoop native库;

可以在linux系统下安装lzop命令,使用方便;

压缩率比gzip要低一些;

hadoop本身不支持,需要安装;

在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式);

因此①适用于较大文本的处理

5.snappy压缩

高速压缩速度和合理的压缩率;
支持hadoop native库;
不支持split;
压缩率比gzip要低;
hadoop本身不支持,需要安装;
linux系统下没有对应的命令

因此① 当mapreduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据的压缩格式;②或者作为一个mapreduce作业的输出和另外一个mapreduce作业的输入

6.为什么hadoop没有自带lzo和snappy压缩?

主要是由于lzo和snappy压缩采用的是GPL协议,而hadoop是apache协议,有关协议的区别可参考阮大神的图示:

hadoop 压缩输出 hadoop常用压缩算法对比_数据

7.snappy 虽然对于文本格式不具有split特性,但是对于SequenceFile 及Avro格式,Parquet存储来说依然具有split特性

8.关于lzo和snappy的安装及更多介绍可参考:

http://www.cloudera.com/documentation/enterprise/latest/topics/admin_data_compression_performance.html

https://boristyukin.com/is-snappy-compressed-parquet-file-splittable/