1. 程式人生 > >Hive實踐分享之儲存和壓縮的坑

Hive實踐分享之儲存和壓縮的坑

在學習大資料技術的過程中,HIVE是非常重要的技術之一,但我們在專案上經常會遇到一些儲存和壓縮的坑。

大家都知道,由於叢集資源有限,我們一般都會針對資料檔案的「儲存結構」和「壓縮形式」進行配置優化。在我實際檢視以後,發現叢集的檔案儲存格式為Parquet,一種列式儲存引擎,類似的還有ORC。而檔案的壓縮形式為Snappy。具體的操作形式如下:整理了一份2018年合適程式設計師學習的大資料的學習資料需要的加群QQ群:834325294 註明CSDN既可免費獲取

① 建立Parquet結構的表(Hive 0.13 and later):

 
  1. CREATE TABLE CRM.DEMO(A INT) STORED AS PARQUET ; 

② 確認表的檔案儲存格式:

 
  1. desc formatted crm.demo; 

結果輸出如下

 
  1. # Storage Information              
  2.  
  3. SerDe Library:          org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe       
  4.  
  5. InputFormat:                 org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat      
  6.  
  7. OutputFormat:               org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat  

③ 建立Snappy壓縮格式的Parquet結構的表(待考察):

 
  1. ALTER TABLE crm.demo SET TBLPROPERTIES ('parquet.compression'='SNAPPY') ; 

或,寫入時

 
  1. SET parquet.compression=SNAPPY ; 

回到最初的問題,如果是按Snappy壓縮的格式,這份使用者行為資料沒辦法分析了,因此有兩種辦法去解決:

① 安裝Snappy的解壓工具

可自行百度,由於沒有許可權,所以這條路行不通;

② 更改資料的壓縮格式可以

最初我試了一下更改Parquet格式表的壓縮格式,但是沒有用!因為我最後是需要將查詢資料匯出到本地檔案系統,如下語句所示:

 
  1. insert overwrite local directory '/home/etl/tmp/data' 
  2. select * 
  3. from crm.demo 

所以,通過這樣的形式得到的資料,壓縮格式依然是. Snappy。因此,這裡就需要配置Hive執行過程中的中間資料和最終資料的壓縮格式。

如MapReduce的shuffle階段對mapper產生的中間結果資料壓縮:

 
  1. hive> set mapred.map.output.compression.codec;  
  2. mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec 

如對最終生成的Hive表的資料壓縮:

 
  1. hive> set mapred.output.compression.codec;  
  2. mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec 

這裡,我們要設定結果表資料的壓縮格式,語句如下:

 
  1. set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; 

最終的結果就是 .gz 的壓縮格式

 
  1. -rw-r--r-- 1 etl etl 342094 May 10 11:13 000000_0.gz 

最後,我們直接下載到電腦本地,直接解壓就可以通過Excel分析使用者行為路徑資料了。

總結:從Hive應用層的角度來說,關於資料檔案的「儲存結構」和「壓縮形式」,這兩個點我們不需要關心,只是在匯出資料的時候需要結合檔案大小,以及資料型別去設定合適的壓縮格式。不過從Hive底層維護的角度來說,涉及到各種各樣的「儲存結構」和「壓縮形式」,都需要開發者去研究和調整,這樣才能保證叢集上的檔案在「時間」和「空間」上相對平衡。