hive中合並小文件


Hive小文件產生的原因

   一方面hive數據倉庫中匯總表的數據量通常比源數據少的多,而且為了提升運算速度,我們會增加Reduce的數量,Hive本身也會做類似的優化----Reducer數量等於源數據的量除以hive.exec.reducers.bytes.per.reduce所配置的量(默認1G)。Reduce數量的增加也即意味着結果文件的增加,從而產生小文件的問題。

    解決小文件的問題可以從兩個方向入手:

  • 輸入合並。即在map前合並小文件。
  • 輸出合並。即在輸出結果的時候合並小文件。

  當Hive輸入由很多個小文件組成,由於每個小文件都會啟動一個map任務,如果文件過小,以至於map任務啟動和初始化的時間大於邏輯處理的時間,會造成資源浪費,甚至OOM。
為此,當我們啟動一個任務,發現輸入數據量小但任務數量多時,需要注意在Map前端進行輸入合並

1. Map輸入合並小文件
對應參數:
set mapred.max.split.size=256000000;  #每個Map最大輸入大小
set mapred.min.split.size.per.node=100000000; #一個節點上split的至少的大小 
set mapred.min.split.size.per.rack=100000000; #一個交換機下split的至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #執行Map前進行小文件合並

在開啟了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一個data node節點上多個小文件會進行合並,合並文件數由mapred.max.split.size限制的大小決定。
mapred.min.split.size.per.node決定了多個data node上的文件是否需要合並~
mapred.min.split.size.per.rack決定了多個交換機上的文件是否需要合並~



2.輸出合並
set hive.merge.mapfiles = true #在Map-only的任務結束時合並小文件
set hive.merge.mapredfiles = true #在Map-Reduce的任務結束時合並小文件
set hive.merge.size.per.task = 256*1000*1000 #合並文件的大小
set hive.merge.smallfiles.avgsize=16000000 #當輸出文件的平均大小小於該值時,啟動一個獨立的map-reduce任務進行文件merge


Reference: 
Hive AdminManual 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM