1. 程式人生 > >hadoop常用的壓縮演算法總結和實驗驗證

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;