小文件是如何產(chǎn)生的
- 動態(tài)分區(qū)插入數(shù)據(jù)的時候,會產(chǎn)生大量的小文件从媚,從而導(dǎo)致map數(shù)量的暴增
- 數(shù)據(jù)源本身就包含有大量的小文件
- reduce個數(shù)越多,生成的小文件也越多
小文件的危害
- 從HIVE角度來看的話呢,小文件越多沪斟,map的個數(shù)也會越多,每一個map都會開啟一個JVM虛擬機暇矫,每個虛擬機都要創(chuàng)建任務(wù)主之,執(zhí)行任務(wù),這些流程都會造成大量的資源浪費李根,嚴重影響性能
- 在HDFS中槽奕,每個小文件約占150byte,如果小文件過多則會占用大量的內(nèi)存房轿。這樣namenode內(nèi)存容量嚴重制約了集群的發(fā)展
小文件的解決方案
從小文件的產(chǎn)生途徑解決:
- 使用sequencefile作為表存儲形式粤攒,不要使用textfile所森,在一定程度上可以減少小文件
- 減少reduce的個數(shù)(減少生成分區(qū)數(shù)量)
- 少用動態(tài)分區(qū),使用distribute by分區(qū)
對已經(jīng)存在的小文件做出的解決方案:
使用Hadoop achieve把小文件進行歸檔
重建表夯接,建表時減少reduce的數(shù)量
-
通過參數(shù)調(diào)節(jié)焕济,設(shè)置map/reduce的數(shù)量
-
設(shè)置map輸入合并小文件的相關(guān)參數(shù):
//每個Map最大輸入大小(這個值決定了合并后文件的數(shù)量) set mapred.max.split.size=256000000; //一個節(jié)點上split的至少的大小(這個值決定了多個DataNode上的文件是否需要合并) set mapred.min.split.size.per.node=100000000; //一個交換機下split的至少的大小(這個值決定了多個交換機上的文件是否需要合并) set mapred.min.split.size.per.rack=100000000; //執(zhí)行Map前進行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
-
設(shè)置map輸出和reduce輸出進行合并的相關(guān)參數(shù):
//設(shè)置map端輸出進行合并,默認為true set hive.merge.mapfiles = true //設(shè)置reduce端輸出進行合并盔几,默認為false set hive.merge.mapredfiles = true //設(shè)置合并文件的大小 set hive.merge.size.per.task = 256*1000*1000 //當輸出文件的平均大小小于該值時晴弃,啟動一個獨立的MapReduce任務(wù)進行文件merge。 set hive.merge.smallfiles.avgsize=16000000
-