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=268435456hive.merge.mapredfiles=truehive.merge.mapfiles=truehive.merge.size.per.task=256000000mapred.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數的一個重要環節
處理的不好 會大大影響任務的執行效率