hive 處理小文件,減少map數


1、hive.merge.mapfiles,True時會合並map輸出。
2、hive.merge.mapredfiles,True時會合並reduce輸出。
3、hive.merge.size.per.task,合並操作后的單個文件大小。
4、hive.merge.size.smallfiles.avgsize,當輸出文件平均大小小於設定值時,啟動合並操作。這一設定只有當hive.merge.mapfiles或hive.merge.mapredfiles設定為true時,才會對相應的操作有效。
5、mapred.reduce.tasks=30;  設置Reduce Task個數
6、hive.exec.compress.output=’false’; 設置數據不作壓縮,要是壓縮了我們拿出來的文件就只能通過HIVE-JDBC來解析
7、mapred.map.tasks=1200;
8、hive.optimize.skewjoin=true;這個是給join優化的 0.6官方版本好像有個bug悲哀啊
9、hive.groupby.skewindata=true;這個是給groupby優化的

優化案例一:

使用的生產Hive環境的幾個參數配置如下:

    dfs.block.size=268435456
    hive.merge.mapredfiles=true
    hive.merge.mapfiles=true
    hive.merge.size.per.task=256000000

    mapred.map.tasks=2 

因為合並小文件默認為true,而dfs.block.size與hive.merge.size.per.task的搭配使得合並后的絕大部分文件都在300MB左右。

CASE 1:

現在我們假設有3個300MB大小的文件,那么goalsize = min(900MB/2,256MB) = 256MB (具體如何計算map數請參見http://blog.sina.com.cn/s/blog_6ff05a2c010178qd.html)

所以整個JOB會有6個map,其中3個map分別處理256MB的數據,還有3個map分別處理44MB的數據。

這時候木桶效應就來了,整個JOB的map階段的執行時間不是看最短的1個map的執行時間,而是看最長的1個map的執行時間。所以,雖然有3個map分別只處理44MB的數據,可以很快跑完,但它們還是要等待另外3個處理256MB的map。顯然,處理256MB的3個map拖了整個JOB的后腿。

CASE 2:

如果我們把mapred.map.tasks設置成6,再來看一下有什么變化:

goalsize = min(900MB/6,256MB) = 150MB

整個JOB同樣會分配6個map來處理,每個map處理150MB的數據,非常均勻,誰都不會拖后腿,最合理地分配了資源,執行時間大約為CASE 1的59%(150/256) 

案例分析:

雖然mapred.map.tasks從2調整到了6,但是CASE 2並沒有比CASE 1多用map資源,同樣都是使用6個map。而CASE 2的執行時間約為CASE 1執行時間的59%。

從這個案例可以看出,對mapred.map.tasks進行自動化的優化設置其實是可以很明顯地提高作業執行效率的。

案例二(處理小文件):

最近倉庫里面新建了一張分區表,數據量大約是12億行,分區比較多,從2008年7月開始 一天一個分區。

配置了一個任務

對這個表進行group by 的時候 發現啟動了2800多個maps .

執行的時間也高大10分鍾。

然后我在hdfs文件里面看到 這個表的每個分區里面都有20多個小文件,每個文件都不大 300KB--1MB

 

之前的hive的參數:

hive.merge.mapfiles=true

hive.merge.mapredfiles=false

hive.merge.rcfile.block.level=true

hive.merge.size.per.task=256000000

hive.merge.smallfiles.avgsize=16000000

hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

mapred.max.split.size=256000000

mapred.min.split.size=1

mapred.min.split.size.per.node=1

mapred.min.split.size.per.rack=1

 

hive.merge.mapredfiles 這個指的是 在Map-Reduce的任務結束時合並小文件

解決辦法:

1.修改參數hive.merge.mapredfiles=true

2.通過map_reduece的辦法生成一張新的表 此時生成的文件變成了每個分區一個文件

 

再次執行group by 發現效率得到了大大的提升。

小結:

正確處理hive小文件 是 控制map數的一個重要環節

處理的不好 會大大影響任務的執行效率


免責聲明!

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



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