Hive压缩说明
為什么要壓縮
在Hive中對中間數據或最終數據做壓縮,是提高數據吞吐量和性能的一種手段。對數據做壓縮,可以大量減少磁盤的存儲空間,比如基于文本的數據文件,可以將文件壓縮40%或更多。同時壓縮后的文件在磁盤間傳輸和I/O也會大大減少;當然壓縮和解壓縮也會帶來額外的CPU開銷,但是卻可以節省更多的I/O和使用更少的內存開銷。
壓縮模式說明
1. 壓縮模式評價
可使用以下三種標準對壓縮方式進行評價:
壓縮比:壓縮比越高,壓縮后文件越小,所以壓縮比越高越好。 壓縮時間:越快越好。 已經壓縮的格式文件是否可以再分割:可以分割的格式允許單一文件由多個Mapper程序處理,可以更好的并行化。2. 壓縮模式對比
BZip2有最高的壓縮比但也會帶來更高的CPU開銷,Gzip較BZip2次之。如果基于磁盤利用率和I/O考慮,這兩個壓縮算法都是比較有吸引力的算法。 LZO和Snappy算法有更快的解壓縮速度,如果更關注壓縮、解壓速度,它們都是不錯的選擇。 LZO和Snappy在壓縮數據上的速度大致相當,但Snappy算法在解壓速度上要較LZO更快。 Hadoop的會將大文件分割成HDFS block(默認64MB)大小的splits分片,每個分片對應一個Mapper程序。在這幾個壓縮算法中 BZip2、LZO、Snappy壓縮是可分割的,Gzip則不支持分割。3. 常見壓縮格式
Hadoop編碼/解碼器方式,如下表所示
4. 什么是可分割
在考慮如何壓縮那些將由MapReduce處理的數據時,考慮壓縮格式是否支持分割是很重要的。考慮存儲在HDFS中的未壓縮的文件,其大小為1GB,HDFS的塊大小為64MB,所以該文件將被存儲為16塊,將此文件用作輸入的MapReduce作業會創建1個輸人分片(split,也稱為“分塊”。對于block,我們統一稱為“塊”。)每個分片都被作為一個獨立map任務的輸入單獨進行處理。
現在假設,該文件是一個gzip格式的壓縮文件,壓縮后的大小為1GB。和前面一樣,HDFS將此文件存儲為16塊。然而,針對每一塊創建一個分塊是沒有用的,因為不可能從gzip數據流中的任意點開始讀取,map任務也不可能獨立于其他分塊只讀取一個分塊中的數據。gzip格式使用DEFLATE來存儲壓縮過的數據,DEFLATE將數據作為一系列壓縮過的塊進行存儲。問題是,每塊的開始沒有指定用戶在數據流中任意點定位到下一個塊的起始位置,而是其自身與數據流同步。因此,gzip不支持分割(塊)機制。
在這種情況下,MapReduce不分割gzip格式的文件,因為它知道輸入是gzip壓縮格式的(通過文件擴展名得知),而gzip壓縮機制不支持分割機制。因此一個map任務將處理16個HDFS塊,且大都不是map的本地數據。與此同時,因為map任務少,所以作業分割的粒度不夠細,從而導致運行時間變長。
Hive中壓縮設置
Hive中間數據壓縮
hive.exec.compress.intermediate:默認該值為false,設置為true為激活中間數據壓縮功能。HiveQL語句最終會被編譯成Hadoop的Mapreduce job,開啟Hive的中間數據壓縮功能,就是在MapReduce的shuffle階段對mapper產生的中間結果數據壓縮。在這個階段,優先選擇一個低CPU開銷的算法。
mapred.map.output.compression.codec:該參數是具體的壓縮算法的配置參數,SnappyCodec比較適合在這種場景中編解碼器,該算法會帶來很好的壓縮性能和較低的CPU開銷。設置如下:
| 1 2 3 | 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最終數據壓縮
hive.exec.compress.output:用戶可以對最終生成的Hive表的數據通常也需要壓縮。該參數控制這一功能的激活與禁用,設置為true來聲明將結果文件進行壓縮。
mapred.output.compression.codec:將hive.exec.compress.output參數設置成true后,然后選擇一個合適的編解碼器,如選擇SnappyCodec。設置如下:
| 1 2 | set hive.exec.compress.output=true set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec |
Hive中文件格式說明
常見的hive文件存儲格式包括以下幾類:TEXTFILE、SEQUENCEFILE、RCFILE、ORC。其中TEXTFILE為默認格式,建表時默認為這個格式,導入數據時會直接把數據文件拷貝到hdfs上不進行處理。SequenceFile、RCFile格式的表不能直接從本地文件導入數據,數據要先導入到TextFile格式的表中,然后再從TextFile表中用insert導入到SequenceFile、RCFile表中。
1. TextFile
Hive數據表的默認格式,存儲方式:行存儲。 可以使用Gzip壓縮算法,但壓縮后的文件不支持split 在反序列化過程中,必須逐個字符判斷是不是分隔符和行結束符,因此反序列化開銷會比SequenceFile高幾十倍。建表代碼
?| 1 2 3 4 5 6 7 8 | ${建表語句} stored as textfile; ##########################################插入數據######################################## set hive.exec.compress.output=true; --啟用壓縮格式 set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;? --指定輸出的壓縮格式為Gzip set mapred.output.compress=true;?? set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;???? insert overwrite table textfile_table select * from T_Name; |
2. Sequence Files
壓縮數據文件可以節省磁盤空間,但Hadoop中有些原生壓縮文件的缺點之一就是不支持分割。支持分割的文件可以并行的有多個mapper程序處理大數據文件,大多數文件不支持可分割是因為這些文件只能從頭開始讀。Sequence File是可分割的文件格式,支持Hadoop的block級壓縮。 Hadoop API提供的一種二進制文件,以key-value的形式序列化到文件中。存儲方式:行存儲。 sequencefile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,RECORD是默認選項,通常BLOCK會帶來較RECORD更好的壓縮性能。 優勢是文件和hadoop api中的MapFile是相互兼容的建表代碼
?| 1 2 3 4 5 6 7 8 9 | ${建表語句} SORTED AS SEQUENCEFILE;??? --將Hive表存儲定義成SEQUENCEFILE ##########################################插入數據######################################## set hive.exec.compress.output=true; --啟用壓縮格式 set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --指定輸出的壓縮格式為Gzip set mapred.output.compression.type=BLOCK;?? --壓縮選項設置為BLOCK set mapred.output.compress=true; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; insert overwrite table textfile_table select * from T_Name; |
3. RCFile
存儲方式:數據按行分塊,每塊按列存儲。結合了行存儲和列存儲的優點:
首先,RCFile 保證同一行的數據位于同一節點,因此元組重構的開銷很低 其次,像列存儲一樣,RCFile 能夠利用列維度的數據壓縮,并且能跳過不必要的列讀取 數據追加:RCFile不支持任意方式的數據寫操作,僅提供一種追加接口,這是因為底層的 HDFS當前僅僅支持數據追加寫文件尾部。 行組大小:行組變大有助于提高數據壓縮的效率,但是可能會損害數據的讀取性能,因為這樣增加了 Lazy 解壓性能的消耗。而且行組變大會占用更多的內存,這會影響并發執行的其他MR作業。 考慮到存儲空間和查詢效率兩個方面,Facebook 選擇 4MB 作為默認的行組大小,當然也允許用戶自行選擇參數進行配置。建表代碼
?| 1 2 3 4 5 6 7 8 | ${建表語句} stored as rcfile; -插入數據操作: set hive.exec.compress.output=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set mapred.output.compress=true; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; insert overwrite table rcfile_table select * from T_Name; |
4. ORCFile
存儲方式:數據按行分塊,每塊按照列存儲。
壓縮快,快速列存取。效率比rcfile高,是rcfile的改良版本。
小結
TextFile默認格式,加載速度最快,可以采用Gzip進行壓縮,壓縮后的文件無法split,即并行處理。 SequenceFile壓縮率最低,查詢速度一般,將數據存放到sequenceFile格式的hive表中,這時數據就會壓縮存儲。三種壓縮格式NONE,RECORD,BLOCK。是可分割的文件格式。 RCfile壓縮率最高,查詢速度最快,數據加載最慢。 相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存儲方式,數據加載時性能消耗較大,但是具有較好的壓縮比和查詢響應。數據倉庫的特點是一次寫入、多次讀取,因此,整體來看,RCFILE相比其余兩種格式具有較明顯的優勢。 在hive中使用壓縮需要靈活的方式,如果是數據源的話,采用RCFile+bz或RCFile+gz的方式,這樣可以很大程度上節省磁盤空間;而在計算的過程中,為了不影響執行的速度,可以浪費一點磁盤空間,建議采用RCFile+snappy的方式,這樣可以整體提升hive的執行速度。至于lzo的方式,也可以在計算過程中使用,只不過綜合考慮(速度和壓縮比)還是考慮snappy適宜。結果展示
對文件進行壓縮對比,主要關注壓縮比這一塊,對壓縮時間并未進行對比。未壓縮文件是5.5G左右。壓縮下如下所示:
1. rcFile+GzipCodec
2. textfile+GzipCodec
3. sequenceFile+GzipCodec
4. rcFile+Snappy
總結
- 上一篇: knx 协议入门
- 下一篇: python去掉停用词_Python -