hive merge小文件

當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 node


Reference:
Hive AdminManual 
相關文章
相關標籤/搜索