1. 程式人生 > >Hive如何處理小檔案問題?

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

 

歡迎留言聯絡,上海尚學堂大資料培訓李同學筆記原創,轉載請先聯絡。