Hive MR優化

Hive MR優化

1. map reduce個數選擇

在這方面,尤其是map的選擇,基本上決定了整個job的運行時間(一般reduce階段數據量都比較少了),map個數的決定因素是split的大小、文件個數、block大小,一般通過split的大小來調整map的個數。

set mapreduce.input.fileinputformat.split.maxsize=67108864;
set mapreduce.input.fileinputformat.split.minsize=67108864;

或者:

set mapred.max.split.size=67108864;

在調整的過程中,最好整倍整倍的調整,具體map調整到一個什麼程度,還需要根據集羣的資源情況;另外一點就是如果是壓縮格式文件,基本上沒法調整,文件個數直接決定了map數。

對於reduce的個數的設置:可通過以下兩個配置項來調整:

set mapred.reduce.tasks=100;
set hive.exec.reducers.bytes.per.redurcer=20971520;

2. 調整一批運行的map數

這裏一批運行的map數指的實在resourceManager界面中觀察,當任務開始運行後,正在運行的map個數,該值實際上是由集羣能力來決定,具體到參數:

set mapreduce.map.memory.mb=2048;
set mapreduce.reduce.memory.mb=2048;
set mapreduce.map.java.opts=Xmx2048M;
set mapreduce.reduce.java.opts=Xmx2048M;
set mapreduce.map.cpu.vcores=2;
set mapreduce.reduce.cpu.vcores=2;

這幾個參數實際上決定了啓動一個map所需要佔用的系統資源,因此在總資源確定的情況下,通過調整這些參數總是能夠調整一批運行的map數量,具體一批運行多少map比較合適,這個需要經過多次調整才知道。

3. 動態調整

動態調整前兩條,保證任務比較均勻的分配到集羣的各個機器上。例如發現所有的map都在第一輪中運行了,但發現運行的比較慢,超過了一個5分鐘,而通過對機器的監控發現有些機器上並沒有map在運行,說明map數劃分的有些少了,且每個map的資源分配的也比較少,需要通過減少split大小來增大map,通過增大map所佔用資源的大小來減少單臺機器上所能運行map數,一般調整到map相對比較均勻的分佈,單個map運行時間大於1分鐘,而又不能太長。

4. 設置合理的reduce啓動時間

通過設置set mapreduce.job.reduce.slowstart.completedmaps=0.1

該參數的意義是當map完成多少時開始啓動reduce,如果不配置,則默認時0.5,當資源比較受限時最好把這個值配置的大一些,否則就會出現reduce和map競爭資源的問題,而reduce又沒法獲取到map的輸出(map全部跑完則爲1,這裏還是零點幾),所以基本上會導致整體運行時間的加長,一般也不要設置成爲1,如果等待map的結束的話,同樣也是浪費資源,所以需要綜合集羣的資源來設置合理的啓動時間。

5. 設置sort時的內存

設置 set mapreduce.task.io.sort.mb=1024; 的值略小於reduce的內存,避免浪費。sort的時候配置到reduce的大小能加快運行速度,也能避免不必要的浪費。

6. 對map的輸出結果進行壓縮,提升從map到reduce的傳輸效率

set mapreduce.output.compress=true;
set mapreduce.output.compression.type=BLOCK;
set mapreduce.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

7. 對於複雜的任務,還需要通過並行來提升整體運行速度

set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;

對於Hive所啓動的MR優化調整是一個相對比較複雜的過程,需要多跑幾次找出性能瓶頸並進行調整纔是解決問題的正確途徑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章