1. 程式人生 > >hadoop中每個節點map和reduce個數的設定調優

hadoop中每個節點map和reduce個數的設定調優

hadoop中每個節點map和reduce個數的設定調優

2012-02-21 14:40:32|  分類:舉報|字號訂閱


map red.tasktracker.map.tasks.maximum
這個是一個task tracker中可同時執行的map的最大個數,預設值為2,看《pro hadoop》:it is common to set this value to theeffective number of CPUs on the node
ob分割成mapreduce,合理地選擇Job Tasks數的大小能顯著的改善Hadoop執行的效能。增加task的個數會增加系統框架的開銷,但同時也會增強負載均衡並降低任務失敗的開銷。一個極端是

1map1reduce的情況,這樣沒有任務並行。另一個極端是1,000,000map1,000,000reduce的情況,會由於框架的開銷過大而使得系統資源耗盡。
Map
任務的數量

Map
的數量經常是由輸入資料中的DFS塊的數量來決定的。這還經常會導致使用者通過調整DFS塊大小來調整map的數量。正確的map任務的並行度似乎應該是10-100 maps/節點,儘管我們對於處理cpu運算量小的任務曾經把這個數字調正到300maps每節點。Task的初始化會花費一些時間,因此最好控制每個 map任務的執行超過一分鐘。實際上控制map任務的個數是很精妙的。mapred.map.tasks引數對於InputFormat設定
map執行的個數來說僅僅是一個提示。InputFormat的行為應該把輸入資料總的位元組值分割成合適數量的片段。但是預設的情況是DFS的塊大小會成為對輸入資料分割片段大小的上界。一個分割大小的下界可以通過一個mapred.min.split.size引數來設定。因此,如果你有一個大小是10TB的輸入資料,並設定DFS塊大小為 128M,你必須設定至少82Kmap任務,除非你設定的mapred.map.tasks引數比這個數還要大。最終InputFormat 決定了map任務的個數。

Map
任務的個數也能通過使用JobConf conf.setNumMapTasks(int num)方法來手動地設定。這個方法能夠用來增加
map任務的個數,但是不能設定任務的個數小於Hadoop系統通過分割輸入資料得到的值。
Reduce
任務的個數正確的reduce任務的個數應該是0.95或者1.75 ×(節點數 ×mapred.tasktracker.tasks.maximum引數值)。如果任務數是節點個數的0.95倍,那麼所有的reduce任務能夠在 map任務的輸出傳輸結束後同時開始執行。如果任務數是節點個數的1.75倍,那麼高速的節點會在完成他們第一批reduce任務計算之後開始計算第二批 reduce任務,這樣的情況更有利於負載均衡。目前reduce任務的數量由於輸出檔案緩衝區大小(io.buffer.size × 2 ×reduce任務個數 << 堆大小),被限制在大約1000個左右。直到能夠指定一個固定的上限後,這個問題最終會被解決。

Reduce
任務的數量同時也控制著輸出目錄下輸出檔案的數量,但是通常情況下這並不重要,因為下一階段的 map/reduce任務會把他們分割成更加小的片段。

Reduce
任務也能夠與 map任務一樣,通過設定JobConf conf.setNumReduceTasks(int num)方法來增加任務個數。