1. 程式人生 > >Hadoop實戰:*********MapReduce的效能調優(一)*********

Hadoop實戰:*********MapReduce的效能調優(一)*********

        下面來談談重頭戲,那就是mapred中的這些NB的引數。前置知識我相信大家都已經瞭解了(如果你還不瞭解mapred的執行機制,看這個也無意義...),首先資料要進行map,然後merge,然後reduce程序進行copy,最後進行reduce,其中的merge和copy總稱可以為shuffle。在你起一個job前,hadoop需要知道你要啟動多少個map,多少個renduce程序,如果你進行預設引數啟動,那麼預設只有一個map執行緒。(reduce也許也是一個..)這個速度是很慢的。設定map啟動個數的引數是mapred.map.tasks,reduce則是mapred.reduce.tasks。
這兩個引數可以說是對整個叢集的效能起主導型作用的引數,除錯也基本上圍繞這兩個引數。那大家要問就兩個引數有什麼好來回修改的呢?其實,這兩個引數的設定配比也直接影響到其他的引數的設定。首當其衝的就是mapred.tasktracker.map.tasks.maximum以及 mapred.tasktracker.reduce.tasks.maximum。因為這兩個引數設定了一臺伺服器上最多能同時執行的map和reduce數。現在我們來假設一個叢集有一個namenode以及8個datanode,這是一個很客觀的叢集。我們假設上面的資料都是三備份,那麼本地資料率為3/8。假設你設定的map.tasks=128,reuce.tasks=64,那麼你的對應的兩個maximum就應該分別為16以及8或是更高。因為這樣才能保證你的所有map和reduce的任務都是分別同時啟動的,如果你的設定reduce的maximum為7,那麼你將得到非常糟糕的結果,因為這樣8臺機器同時可以執行的reduce數量為56了,比你設定的64差8個程序,這八個程序將會處於pending狀態,直到某些正在執行的reduce完成它才能補上執行,勢必大幅度的增加了執行時間。當然,這也不是越大越好,因為map有很長的一段時間是和reduce程序共存的,共存的時間取決於你設定的
mapred.reduce.slowstart.completed.maps,如果你設定為0.6.那麼reduce將在map完成60%後進入執行態。所以說,如果你設定的map和reduce引數都很大,勢必造成map和reduce爭搶資源,造成有些程序飢餓,超時出錯,最大的可能就是socket.timeout的出錯,網路過於繁忙。所以說,這些需要根據叢集的效能,適當除錯新增和減少,以達到最好的效果。那麼,map和reduce之間是怎樣的配比比較好呢?apache官網給了我們一些建議,比如設定reduce與map,他們之間有一個具體的公式。但是實際情況總是不能用公式來套用的(否則就不需要系統工程師了...)。一般情況下,當你設定好map和reduce程序數後,你可以通過hadoop的mapred的頁面入口(http://namenode:50030/jobdetai.jps)檢視map和reduce進度,
如果你發現reduce在33%時,map正好提早一點點到100%,那麼這將是最佳的配比,因為reduce是在33%的時候完成了copy階段,也就是說,map需要再reduce到達33%之前完成所有的map任務,準備好資料。千萬不能讓reduce在等待,但是可以讓map先完成。