Hive小文件處理


小文件是如何產生的:

  1. 動態分區插入數據的時候,會產生大量的小文件,從而導致map數量的暴增
  2. 數據源本身就包含有大量的小文件
  3. reduce個數越多,生成的小文件也越多

小文件的危害:

  1. 從HIVE角度來看的話呢,小文件越多,map的個數也會越多,每一個map都會開啟一個JVM虛擬機,每個虛擬機都要創建任務,執行任務,這些流程都會造成大量的資源浪費,嚴重影響性能
  2. 在HDFS中,每個小文件約占150byte,如果小文件過多則會占用大量的內存。這樣namenode內存容量嚴重制約了集群的發展

小文件的解決方案

從小文件的產生途徑解決:

  1. 使用sequencefile作為表存儲形式,不要使用textfile,在一定程度上可以減少小文件
  2. 減少reduce的個數(減少生成分區數量)
  3. 少用動態分區,使用distribute by分區

對已經存在的小文件做出的解決方案:

  1. 使用Hadoop achieve把小文件進行歸檔

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM