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;