压缩格式总表
压缩格式 |
工具 |
算法 |
扩展名 |
是否可切分 |
DEFLATE |
N/A |
DEFLATE |
.deflate |
No |
gzip |
gzip |
DEFLATE |
.gz |
No |
bzip2 |
bzip2 |
bzip2 |
.bz2 |
Yes |
LZO |
lzop |
LZO |
.lzo |
No |
LZ4 |
N/A |
LZ4 |
.lz4 |
No |
Snappy |
N/A |
Snappy |
.snappy |
No |
压缩算法的时间空间权衡
所有的压缩算法都是时间和空间的转换,更快的压缩时间还是更小的压缩比,可以通过参数来指定,-1意味着速度,-9意味着空间。例如:
Gzip -1 file
压缩算法的速度和压缩比例的特点
压缩算法 |
特点 |
速度和压缩比 |
DEFLATE |
标准压缩算法,没有生成它的常用命令行工具,通常都是用Gzip格式,也就是在deflate格式上添加gzip的文件头和文件尾,.deflate扩展名是hadoop定义的 |
—— |
Gzip |
DEFLATE为基础扩展出来的一种算法; 通用压缩工具,时间和空间消耗比较折中 |
折中 |
Bzip2 |
压缩效果最好,但是压缩和解压速度最慢; 本身的解压速度比压缩速度快 |
压缩效果最好,速度最慢 |
LZO |
比gzip速度快,但是压缩效果不好 |
压缩效果不好, 速度快 |
LZ4 |
比gzip速度快,但是压缩效果不好; 解压比LZO快 |
压缩效果不好, 速度快 |
Snappy |
压缩效果不好, 速度快 |
实验验证
下面是在某公司利用真实的交易数据进行的压缩测试。由于LZO没有安装相应组件未做测试。从真实的实验可以看出,snappy用时最短,bzip2用时最长。Deflate实际上采用了Gzip算法,所以用时和压缩率接近。由于实验仅仅做了一次,再加上测试时间不同,集群性能可能也会有差异,理论上LZ4应该比gzip快。
压缩算法 |
表名 |
压缩时间 |
total time |
原大小 |
压缩后大小 |
压缩比 |
Gzip |
a |
333.276 s |
0 hours 23 min 28 s |
71.9G |
8.1 G |
7.9% |
b |
321.246 s |
229.7 G |
9.4 G | |||
c |
281.316 s |
109.9 G |
7.6 G | |||
d |
379.03 s |
71.9 G |
13.2 G | |||
e |
73.333 s |
5.8 G |
276.0 M | |||
| ||||||
bzip2 |
a |
481.926 s |
0 hours 32 min 10 s |
71.9G |
6.3 G |
6.6% |
b |
478.724 s |
229.7 G |
8.3 G | |||
c |
404.097 s |
109.9 G |
6.4 G | |||
d |
424.537 s |
71.9 G |
11.0 G | |||
e |
125.326 s |
5.8 G |
217.6 M | |||
| ||||||
deflate |
a |
250.34 s |
0 hours 20 min 52 s |
71.9G |
8.1 G |
7.9% |
b |
301.89 s |
229.7 G |
9.4 G | |||
c |
264.25 s |
109.9 G |
7.6 G | |||
d |
337.296 s |
71.9 G |
13.2 G | |||
e |
73.91 s |
5.8 G |
275.9 M | |||
| ||||||
LZ4 |
a |
459.488 s |
0 hours 30 min 27 s |
71.9G |
15.2 G |
13.4% |
b |
478.385 s |
229.7 G |
16.1 G | |||
c |
399.978 s |
109.9 G |
12.5 G | |||
d |
412.668 s |
71.9 G |
21.2 G | |||
e |
60.985 s |
5.8 G |
509.6 M | |||
| ||||||
Snappy |
a |
216.268 s |
0 hours 19 min 6 s |
71.9G |
14.0 G |
13% |
b |
281.972 s |
229.7 G |
16.0 G | |||
c |
241.483 s |
109.9 G |
12.2 G | |||
d |
322.299 s |
71.9 G |
20.7 G | |||
e |
63.202 s |
5.8 G |
548.5 M |
以上采用hive进行测试,每次新建一个rcfile格式的表,从原始数据insert overwrite select进行数据导入,在执行脚本之前设置压缩算法,压缩算法的设置如下:
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set mapred.min.split.size=536870912;
set mapred.min.split.size.per.node=536870912;
set mapred.min.split.size.per.rack=536870912;
set mapred.output.compress=true;
--设置压缩功能开启
SET hive.exec.compress.output=true;
--设置压缩编码
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
--SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
--SET mapred.output.compression.codec=org.apache.hadoop.io.compress.Lz4Codec;
--SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
--SET mapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec;--deflate
--SET mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;
--设置压缩类型block
SET mapred.output.compression.type=BLOCK;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;