mapreduce優化方案

1.任務調度

任務調度是hadoop中重要的環節

1.計算方面,hadoop會將任務分配給空閒機器,使所有的任務能公平地分享系統資源

2.I/O數據流方面,會盡量將map任務分配給InputSplit所在的機器,減少I/O操作。

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

1.mapredue適合處理少量的大數據,所以提交任務時可以對預處理數據進行合併以提高執行效率。

2.如果一個map執行速度快,當一個map任務執行幾秒就結束時,就要考慮給它分配更多的數據,通常而言一個map執行時間在1分鐘比較合適。

可以設置map輸入數據的大小來調節map的運行時間,Hadoop會在處理每個Block後將其作爲一個InputSplit,因此合理地設置block塊大小是很重 要的調節方式。除此之外,也可以通過合理地設置Map任務的數量來調節Map任務的數據輸入。

3.分配map和reduce任務的數量

通過屬性

mapred.tasktracker.map.tasks.maximum 設置map任務的最大數量

mapred.tasktracker.reduce.tasks.maximum設置reduce任務最大數量

3.mapreduce的任務數量

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

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

(在Hadoop中默認是運行一個Reducer,所有的Reduce任務都會放到單一的Reducer去執行,效率非常低下。爲了提高性能,可以適當增大Reducer的數量。最優的Reducer數量取決於集羣中可用的Reducer任務槽的數目。Reducer任務槽的數目是集羣中節點個數與mapred.tasktracker.reduce.tasks.maximum(默認爲2)的乘積,也可以通過MapReduce的用戶界面獲得)


4. Combine函數

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

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

   job.setCombinerClass(combine.class);

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

   job.setCombinerClass(Reduce.class);

5.壓縮,減少I/O

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

6. 自定義comparator

1.在Hadoop中,可以自定義數據類型以實現更復雜的目的,比如,當讀者想實現k-means算法(一個基礎的聚類算法)時可以定義k個整數的集合。自定義Hadoop數據類型時,推薦自定義comparator來實現數據的二進制比較,這樣可以省去數據序列化和反序列化的時間,提高程序的運行效率。


發佈了52 篇原創文章 · 獲贊 24 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章