Hadoop編碼/解碼器方式,以下表所示算法
壓縮格式 | 對應的編碼/解碼 |
---|---|
DEFAULT | org.apache.hadoop.io.compress.DefaultCodec |
Gzip | org.apache.hadoop.io.compress.GzipCodec |
Bzip | org.apache.hadoop.io.compress.BzipCodec |
Snappy | org.apache.hadoop.io.compress.SnappyCodec |
Lzo | org.apache.hadoop.io.compress.LzopCodec |
HiveQL語句最終都將轉換成爲hadoop中的MapReduce job,而MapReduce job能夠有對處理的數據進行壓縮。apache
Hive中間數據壓縮api
hive.exec.compress.intermediate:默認爲false,設置true爲激活中間數據壓縮功能,就是MapReduce的shuffle階段對mapper產生中間壓縮,在這個階段,優先選擇一個低CPU開銷:併發
set hive.exec.compress.intermediate=true set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec
最終輸出結果壓縮
hive.exec.compress.output:用戶能夠對最終生成的Hive表的數據一般也須要壓縮。該參數控制這一功能的激活與禁用,設置爲true來聲明將結果文件進行壓縮。app
mapred.output.compression.codec:將hive.exec.compress.output參數設置成true後,而後選擇一個合適的編解碼器,如選擇SnappyCodec。設置以下(兩種壓縮的編寫方式是同樣的):工具
set hive.exec.compress.output=true set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec 或者 或者 set mapred.output.compress=true set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec
1. TEXTFILEoop
create table if not exists textfile_table( site string, url string, pv bigint, label string) row format delimited fields terminated by '\t' stored as textfile; 插入數據操做: set hive.exec.compress.output=true; //輸出結果壓縮開啓 set mapred.output.compress=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; //壓縮和解壓縮編碼類列表,用逗號分隔,將所用到解壓和壓縮碼設置其中 insert overwrite table textfile_table select * from testfile_table;
2. SEQUENCEFILE性能
create table if not exists seqfile_table( site string, url string, pv bigint, label string) row format delimited fields terminated by '\t' stored as sequencefile; 插入數據操做: set hive.exec.compress.output=true; set mapred.output.compress=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; SET mapred.output.compression.type=BLOCK; insert overwrite table seqfile_table select * from testfile_table;
3. RCFILE大數據
create table if not exists rcfile_table( site string, url string, pv bigint, label string) row format delimited fields terminated by '\t' stored as rcfile; 插入數據操做: set hive.exec.compress.output=true; set mapred.output.compress=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; insert overwrite table rcfile_table select * from testfile_table;
4. ORCFILE編碼
create table if not exists orcfile_table( site string, url string, pv bigint, label string) row format delimited fields terminated by '\t' stored as orc; 插入數據操做: set hive.exec.compress.output=true; set mapred.output.compress=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; insert overwrite table orcfile_table select * from testfile_table;
總結:
TextFile默認格式,加載速度最快,能夠採用Gzip進行壓縮,壓縮後的文件沒法split,沒法並行處理了。
SequenceFile壓縮率最低,查詢速度通常,將數據存放到sequenceFile格式的hive表中,這時數據就會壓縮存儲。三種壓縮格式NONE,RECORD,BLOCK。是可分割的文件格式。
相比TEXTFILE和SEQUENCEFILE,RCFILE因爲列式存儲方式,數據加載時性能消耗較大,可是具備較好的壓縮比和查詢響應。數據倉庫的特色是一次寫入、屢次讀取,所以,總體來看,RCFILE相比其他兩種格式具備較明顯的優點。
在hive中使用壓縮須要靈活的方式,若是是數據源的話,採用RCFile+bz或RCFile+gz的方式,這樣能夠很大程度上節省磁盤空間;而在計算的過程當中,爲了避免影響執行的速度,能夠浪費一點磁盤空間,建議採用RCFile+snappy的方式,這樣能夠總體提高hive的執行速度。至於lzo的方式,也能夠在計算過程當中使用,只不過綜合考慮(速度和壓縮比)仍是考慮snappy適宜。