MapReduce優化----6個基礎知識

MapReduce任務的優化

相信每個程序員在編程時都會問自己兩個問題“我如何完成這個任務”,以及“怎麼能讓程序運行得更快”。同樣,MapReduce計算模型的多次優化也是爲了更好地解答這兩個問題。

MapReduce計算模型的優化涉及了方方面面的內容,但是主要集中在兩個方面:一是計算性能方面的優化;二是I/O操作方面的優化。這其中,又包含六個方面的內容。

1. 任務調度

任務調度是Hadoop中非常重要的一環,這個優化又涉及兩個方面的內容。計算方面:Hadoop總會優先將任務分配給空閒的機器,使所有的任務能公平地分享系統資源。I/O方面:Hadoop會盡量將Map任務分配給InputSplit所在的機器,以減少網絡I/O的消耗。

2. 數據預處理與InputSplit的大小

MapReduce任務擅長處理少量的大數據,而在處理大量的小數據時,MapReduce的性能就會遜色很多。因此在提交MapReduce任務前可以先對數據進行一次預處理,將數據合併以提高MapReduce任務的執行效率,這個辦法往往很有效。如果這還不行,可以參考Map任務的運行時間,當一個Map任務只需要運行幾秒就可以結束時,就需要考慮是否應該給它分配更多的數據。通常而言,一個Map任務的運行時間在一分鐘左右比較合適,可以通過設置Map的輸入數據大小來調節Map的運行時間。在FileInputFormat中(除了CombineFileInputFormat),Hadoop會在處理每個Block後將其作爲一個InputSplit,因此合理地設置block塊大小是很重要的調節方式。除此之外,也可以通過合理地設置Map任務的數量來調節Map任務的數據輸入。

3. Map和Reduce任務的數量

合理地設置Map任務與Reduce任務的數量對提高MapReduce任務的效率是非常重要的。默認的設置往往不能很好地體現出MapReduce任務的需求,不過,設置它們的數量也要有一定的實踐經驗。

首先要定義兩個概念—Map/Reduce任務槽。Map/Reduce任務槽就是這個集羣能夠同時運行的Map/Reduce任務的最大數量。比如,在一個具有1200臺機器的集羣中,設置每臺機器最多可以同時運行10個Map任務,5個Reduce任務。那麼這個集羣的Map任務槽就是12000,Reduce任務槽是6000。任務槽可以幫助對任務調度進行設置。

設置MapReduce任務的Map數量主要參考的是Map的運行時間,設置Reduce任務的數量就只需要參考任務槽的設置即可。一般來說,Reduce任務的數量應該是Reduce任務槽的0.95倍或是1.75倍,這是基於不同的考慮來決定的。當Reduce任務的數量是任務槽的0.95倍時,如果一個Reduce任務失敗,Hadoop可以很快地找到一臺空閒的機器重新執行這個任務。當Reduce任務的數量是任務槽的1.75倍時,執行速度快的機器可以獲得更多的Reduce任務,因此可以使負載更加均衡,以提高任務的處理速度。

4. Combine函數

Combine函數是用於本地合併數據的函數。在有些情況下,Map函數產生的中間數據會有很多是重複的,比如在一個簡單的WordCount程序中,因爲詞頻是接近與一個zipf分佈的,每個Map任務可能會產生成千上萬個記錄,若將這些記錄一一傳送給Reduce任務是很耗時的。所以,MapReduce框架運行用戶寫的combine函數用於本地合併,這會大大減少網絡I/O操作的消耗。此時就可以利用combine函數先計算出在這個Block中單詞the的個數。合理地設計combine函數會有效地減少網絡傳輸的數據量,提高MapReduce的效率。

在MapReduce程序中使用combine很簡單,只需在程序中添加如下內容:

job.setCombinerClass(combine.class);

在WordCount程序中,可以指定Reduce類爲combine函數,具體如下:

job.setCombinerClass(Reduce.class);

5. 壓縮

編寫MapReduce程序時,可以選擇對Map的輸出和最終的輸出結果進行壓縮(同時可以選擇壓縮方式)。在一些情況下,Map的中間輸出可能會很大,對其進行壓縮可以有效地減少網絡上的數據傳輸量。對最終結果的壓縮雖然會減少數據寫HDFS的時間,但是也會對讀取產生一定的影響,因此要根據實際情況來選擇(第7章中提供了一個小實驗來驗證壓縮的效果)。

6. 自定義comparator

在Hadoop中,可以自定義數據類型以實現更復雜的目的,比如,當讀者想實現k-means算法(一個基礎的聚類算法)時可以定義k個整數的集合。自定義Hadoop數據類型時,推薦自定義comparator來實現數據的二進制比較,這樣可以省去數據序列化和反序列化的時間,提高程序的運行效率(具體會在第7章中講解)。
發佈了119 篇原創文章 · 獲贊 11 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章