Hive中數據壓縮算法使用詳解與性能分析

     HIVE底層是hdfs和mapreduce實現存儲和計算的。所以HIVE可以使用hadoop自帶的InputFormat和Outputformat實現從不同的數據源讀取文件和寫出不同格式的文件到文件系統中。同理,HIVE也可以使用hadoop配置的壓縮方法對中間結果或最終數據進行壓縮。

1.什麼是壓縮及優劣?

       hive中數據做壓縮和解壓縮跟windows下的數據壓縮差不錯,同樣有很多中壓縮算法,結果是以不同的後綴名區別。使用數據壓縮好處是可以最大程度的減少文件所需的磁盤空間和網絡I/O的開銷,尤其文本文件一般壓縮率可以高達40%左右,對於集羣來說帶寬是稀有資源,所有網絡傳輸性能的提升很重要 。但是使用壓縮和解壓縮會增加CPU的開銷。

     所以具體使不使用數據壓縮,具體取決於job類型:對那些I/O密集型的作業使用數據壓縮,cpu密集型,使用壓縮反而會降低性能。不過對於作業的類型的判斷,只能通過實際測量對比執行結果去分析。

2.HIVE中常見的壓縮算法

      注意,注意,注意,hive中的壓縮算法主要取決於hadoop版本。不同的版本會系統不同的壓縮編碼和解碼器。比如我們公司目前使用的hadoop2.9版本已經支持了很多種壓縮方式,版本越高支持的壓縮方式越多。可以在hadoop下的core-site.xm文件中配置壓縮方式,hive使用的也是這個配置文件。如下是我集羣中配置的的壓縮方式,實際開發中可以根據自己需求配置壓縮方式。當然如果不配置的話,默認則不會使用壓縮。比如我們公司就沒有配置使用snappy壓縮方法。

<property>  
        <name>io.compression.codecs</name>  
        <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.BZip2Codec</value>  
</property>  

可以通過如下命令查看hive中已經配置好的壓縮算法。使用set命令可以查看所有hive配置文件中的屬性值以及hive安裝環境的hadoop文件的屬性值。hive中默認壓縮是關閉的,可以通過set hive.exec.compress.output來查看

hive (fdm_sor)> set io.compression.codecs;
io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.BZip2Codec

     如上查詢的結果是對應的算法在hadoop底層的類,爲什麼要有不同壓縮算法呢?主要是因爲不同的壓縮算法在壓縮率和壓縮時間,壓縮的文件是否可切分等方面都不同,實際開發中需要根據實際情況權衡使用。   

 壓縮格式              對應的類  文件擴展名  是否支持多文件  文件可分割性

 DEFLATE

(默認)

 org.apache.hadoop.io.compress.DefaultCodec  .deflate  不  不
 gzip org.apache.hadoop.io.compress.GzipCodec  .gz  不  不
 bzip2 org.apache.hadoop.io.compress.BZip2Codec  .bz2  不  是
 LZO  com.hadoop.compression.lzo.LzopCodec  .lzo_deflate  不  是
Lzop com.hadoop.compression.lzo.LzopCodec; .lzo  不  是

三.HIVE中壓縮算法性能分析

       這裏測試的表中文件是516.4MB,hadoop環境的塊設置大小是256Mb,正好這樣數據存儲是分塊存儲,計算有IO的開銷。可以測算不同壓縮算法下數據傳輸計算的時間,以及壓縮率等因子。

[robot~]hadoop fs -du h  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901
516.4 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901/201901.txt
這是直接從linux本地load的文件到hdfs上,文件實際數據大小是516.4Mb

1.hive中不使用壓縮,進行計算與存儲

--1.無壓縮算法下進行數據存儲計算。
set hive.exec.compress.output=false; --默認就是false的
insert overwrite table t_fin_demo partition(staits_date ='201900') 
select 
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';

2.使用du -h命令查看hdfs上文件存儲情況
[finance@master2-dev software]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900

271.0 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000000_0
271.0 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000001_0
4.7 M    /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000002_0
3.程序運行時間
Total MapReduce CPU Time Spent: 54 seconds 200 msec
Time taken: 36.445 seconds

 總結:從上面數據看出,無壓縮模式下,數據存儲的格式就是文本格式,無後綴名,可以直接從-cat查看。文件存儲大小是原本文件的大小271+271+4.7=546.7Mb,運行時間是36.445。

2.使用hive默認的壓縮方式,hive存儲的文件後綴是.deflate

1.使用deflate進行壓縮
set hive.exec.compress.output=true; 
--true是開啓壓縮,默認是關閉的,如果開啓後不指定壓縮方式,默認使用defalte。
set  mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec;
insert overwrite  table t_fin_demo partition(staits_date ='201904') 
select 
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';

2.查看數據存儲和計算情況
[finance@master2-dev hadoop]$ hadoop fs -du -h  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903
75.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000000_0.deflate
75.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000001_0.deflate
1.3 M   /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000002_0.deflate

3.程序耗時時間:
Time taken: 54.659 seconds

總結:上面數據看,使用默認的的deflate壓縮算法,數據存儲文件後綴名爲.deflate.文件存儲的大小是:75.9+75.9+1.3=153.1。程序耗時是54.659s.可以看出deflate壓縮的壓縮率很高,但是程序耗時相比不壓縮有所上升。

3.使用gzip進行壓縮,hive中文件後綴是.gz

1.使用Gzip進行壓縮存儲
set hive.exec.compress.output=true;
set  mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
insert overwrite  table t_fin_demo partition(staits_date ='201904') 
select 
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';

2.使用du -h命令查看hdfs上文件存儲情況
[finance@master2-dev hadoop]$ hadoop fs -du -h  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904
75.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000000_0.gz
75.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000001_0.gz
1.3 M   /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000002_0.gz

3.程序運行時間
Total MapReduce CPU Time Spent: 1 minutes 33 seconds 430 msec
OK
Time taken: 62.436 seconds

總結:上面數據看,使用默認的的gzip壓縮算法,數據存儲文件後綴名爲.gz文件存儲的大小是:75.9+75.9+1.3=153.1。程序耗時是62.436.如果下載到windows本地解壓後可讀

4.使用lzo壓縮算法進行壓縮,文件後綴是.lzo_deflate

1.使用lzo進行壓縮存儲
set hive.exec.compress.output=true;
set  mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;
insert overwrite  table t_fin_demo partition(staits_date ='201905') 
select 
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';

2.使用du -h命令查看hdfs上文件存儲情況
[finance@master2-dev hadoop]$ hadoop fs -du -h  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905
121.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000000_0.lzo_deflate
121.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000001_0.lzo_deflate
2.1 M    /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000002_0.lzo_deflate

3.程序運行時間
Total MapReduce CPU Time Spent: 58 seconds 700 msec
OK
Time taken: 42.45 seconds

總結:上面數據看,使用默認的的lzo壓縮算法,數據存儲文件後綴名爲.lzo_deflate.文件存儲的大小是:121.9+121.9+2.1=245.9。程序耗時是42.45s。

5.使用Lzop壓縮方式,hive存儲的文件後綴是.lzo

1.使用lzop進行壓縮存儲
set hive.exec.compress.output=true;
set  mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;
insert overwrite  table t_fin_demo partition(staits_date ='201906') 
select 
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';

2.使用du -h命令查看hdfs上文件存儲情況
[finance@master2-dev hadoop]$ hadoop fs -du -h  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906
121.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000000_0.lzo
121.9 M  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000001_0.lzo
2.1 M    /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000002_0.lzo

3.程序運行時間
Total MapReduce CPU Time Spent: 47 seconds 280 msec
OK
Time taken: 34.439 seconds

總結:上面數據看,使用默認的的Lzop壓縮算法,數據存儲文件後綴名爲.lzo。文件存儲的大小是:121.9+121.9+2.1=245.9。程序耗時是34.439s。

6.使用BZip2壓縮方式,hive存儲的文件後綴是.bz2

1.使用Bzip2進行壓縮存儲
set hive.exec.compress.output=true;
set  mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
insert overwrite  table t_fin_demo partition(staits_date ='201907') 
select 
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';

2.使用du -h命令查看hdfs上文件存儲情況
[finance@master2-dev hadoop]$ hadoop fs -du -h  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907
52.5 M   /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000000_0.bz2
52.5 M   /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000001_0.bz2
935.2 K  /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000002_0.bz2

3.程序運行時間
Total MapReduce CPU Time Spent: 2 minutes 47 seconds 530 msec
OK
Time taken: 96.42 seconds

總結:上面數據看,使用默認的的Bzip2壓縮算法,數據存儲文件後綴名爲.bz2。文件存儲的大小是:52.5+52.5+0.934=106Mb。程序耗時是96.42s

各種壓縮算法綜合分析

壓縮方式 原文件大小 壓縮後文件 運行時間 備註
不使用壓縮 516.4Mb 546.70Mb 36.445s  
defalte(默認壓縮) 516.4Mb 153.16Mb 54.659s 壓縮率高
lzo壓縮 516.4Mb 245.90Mb 42.45s LZO壓縮和解壓縮很快,但是壓縮的文件較大
Lzop壓縮 516.4Mb 249.90Mb 34.439s LZOP壓縮和解壓縮很快,但是壓縮的文件較大
gzip壓縮 516.4Mb 153.16Mb 62.436s GZip 和 BZip2壓縮可以保證最小的壓縮文件,但是過於消耗時間,非常不適合CPU型運算。
Bzip2壓縮 516.4Mb 106.00Mb 96.42s  GZip 和 BZip2壓縮可以保證最小的壓縮文件,但是過於消耗時間,不適合CPU型運算。

綜合上表可以看出,每種壓縮算法都有自己的優缺點。具體使用哪種壓縮取決於具體存儲的數據格式與計算模式有關。具體原理參考後續博客。

1.就壓縮比來說:bzip2>gzip>deflate>lzo,故bzip2最節省存儲空間,但是耗時高哇。

2.解壓速度和耗時:lzo>deflate>gzip>bzip2   lzo解壓速度是最快的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章