1.小文件產生
使用hive過程中經常會遇到小文件問題:
- 在執行插入數據操作過程中,可能會產生小文件(map輸入);
- map-only作業,可能會產生小文件(map輸出);
- map-reduce作業,每個reduce輸出一個文件,可能產生小文件(reduce輸出)。
2.小文件影響
- hdfs存儲:存儲過多小文件會產生大量元數據,會增加NameNode占有的空間,影響集群健康和拓展
- hive任務:默認情況下,hive輸入端的處理每個小文件會啟用一個map,一個map啟用一個JVM去執行,啟用map和JVM過程資源占用比例相對提高,影響性能。
3.小文件處理參數設置
3.1輸入端:如果執行任務前,存在小文件,在執行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;
3.2輸出端:通過輸出端小文件合並,減少產生的小文件數量
設置:啟用小文件合並 - Map-Only作業,默認true;
set hive.merge.mapfiles=true;
設置:啟用小文件合並 - Map-Reduce作業,默認false;
set hive.merge.mapredfiles=true;
設置:合並后所需每個文件的大小,默認256MB;這個數值是個約數,合並后文件大小會有上下浮動;
hive.merge.size.per.task=268534456;
設置:小文件平均大小合並閾值,默認16MB;
set hive.merge.smallfiles.avgsize=16777216;
設置:啟用小文件合並 - Spark 作業,默認false;
set hive.merge.sparkfiles=true;
設置:啟用小文件合並 - Tez 作業,默認false;
set hive.merge.tezfiles=true;