hadoop经常使用的压缩算法总结和实验验证
压缩格式总表
压缩格式 |
工具 |
算法 |
扩展名 |
是否可切分 |
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;