Hive如何處理小檔案問題?
一、小檔案是如何產生的
1.動態分割槽插入資料,產生大量的小檔案,從而導致map數量劇增。
2.reduce數量越多,小檔案也越多(reduce的個數和輸出檔案是對應的)。
3.資料來源本身就包含大量的小檔案。
二、小檔案問題的影響
1.從Hive的角度看,小檔案會開很多map,一個map開一個JVM去執行,所以這些任務的初始化,啟動,執行會浪費大量的資源,嚴重影響效能。
2.在HDFS中,每個小檔案物件約佔150byte,如果小檔案過多會佔用大量記憶體。這樣NameNode記憶體容量嚴重製約了叢集的擴充套件。
三、小檔案問題的解決方案
從小檔案產生的途經就可以從源頭上控制小檔案數量,方法如下:
1.使用Sequencefile作為表儲存格式,不要用textfile,在一定程度上可以減少小檔案。
2.減少reduce的數量(可以使用引數進行控制)。
3.少用動態分割槽,用時記得按distribute by分割槽。
四、對於已有的小檔案,我們可以通過以下幾種方案解決:
1.使用hadoop archive命令把小檔案進行歸檔。
2.重建表,建表時減少reduce數量。
3.通過引數進行調節,設定map/reduce端的相關引數,如下:
設定map輸入合併小檔案的相關引數:
//每個Map最大輸入大小(這個值決定了合併後文件的數量)
set mapred.max.split.size=256000000;
//一個節點上split的至少的大小(這個值決定了多個DataNode上的檔案是否需要合併)
set mapred.min.split.size.per.node=100000000;
//一個交換機下split的至少的大小(這個值決定了多個交換機上的檔案是否需要合併)
set mapred.min.split.size.per.rack=100000000;
//執行Map前進行小檔案合併
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
設定map輸出和reduce輸出進行合併的相關引數:
//設定map端輸出進行合併,預設為true
set hive.merge.mapfiles = true
//設定reduce端輸出進行合併,預設為false
set hive.merge.mapredfiles = true
//設定合併檔案的大小
set hive.merge.size.per.task = 256*1000*1000
//當輸出檔案的平均大小小於該值時,啟動一個獨立的MapReduce任務進行檔案merge。
set hive.merge.smallfiles.avgsize=16000000
歡迎留言聯絡,上海尚學堂大資料培訓李同學筆記原創,轉載請先聯絡。