压缩格式总表
压缩格式 | 工具 | 算法 | 扩展名 | 是否可切分 |
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;