MapReduce企業優化,Hadoop企業優化

MapReduce企業優化,Hadoop企業優化

MapReduce跑的慢的原因

Mapreduce 程序效率的瓶頸在於兩點:
1.計算機性能
CPU、內存、磁盤健康、網絡
2.I/O 操作
(1)數據傾斜
(2)map和reduce數設置不合理 combineTextinputformat,分區
(3)map運行時間太長,導致reduce等待過久
(4)小文件過多
(5)spill(溢出)次數過多,溢出數據到磁盤,
(6)merge次數過多等。Shuffule,溢出之後會有合併,reduce端也會有合併

MapReduce優化方法

MapReduce優化方法主要從六個方面考慮:數據輸入、Map階段、Reduce階段、IO傳輸、數據傾斜問題和常用的調優參數。
數據輸入
(1)合併小文件:在執行mr任務前將小文件進行合併,大量的小文件會產生大量的map任務,大量節點資源被佔用,從而導致mr整體運行較慢。
(2)採用CombineTextInputFormat來作爲輸入,解決輸入端大量小文件場景。
Map階段
1)減少溢寫(spill)次數:通過調整io.sort.mb及sort.spill.percent參數值(在mapred-default.xml),增大觸發spill的內存上限,減少spill次數,從而減少磁盤IO。
2)減少合併(merge)次數:通過調整io.sort.factor參數(在mapred-default.xml),增大merge的文件數目,減少merge的次數,從而縮短mr處理時間。
3)在map之後,不影響業務邏輯前提下,先進行combine處理,減少 I/O。
Reduce階段
1)合理設置map和reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致task等待,延長處理時間;太多,會導致 map、reduce任務間競爭資源,造成處理超時等錯誤。
2)設置map、reduce共存:調整slowstart.completedmaps參數,使map運行到一定程度後,reduce也開始運行,減少reduce的等待時間。
3)合理設置reduce端的buffer:默認情況下,數據達到一個閾值的時候,buffer中的數據就會寫入磁盤,然後reduce會從磁盤中獲得所有的數據。也就是說,buffer和reduce是沒有直接關聯的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那麼就可以通過參數來配置,使得buffer中的一部分數據可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認爲0.0。當值大於0的時候,會保留指定比例的內存讀buffer中的數據直接拿給reduce使用。這樣一來,設置buffer需要內存,讀取數據需要內存,reduce計算也要內存,所以要根據作業的運行情況進行調整。
數據傾斜問題
1.數據傾斜現象
數據頻率傾斜——某一個區域的數據量要遠遠大於其他區域。
2.如何收集傾斜數據
在reduce方法中加入記錄map輸出鍵的詳細情況的功能。
3.減少數據傾斜的方法
方法1:自定義分區
基於輸出鍵的背景知識進行自定義分區。例如,如果map輸出鍵的單詞來源於一本書。且其中某幾個專業詞彙較多。那麼就可以自定義分區將這這些專業詞彙發送給固定的一部分reduce實例。而將其他的都發送給剩餘的reduce實例。
方法2:Combine
使用Combine可以大量地減小數據傾斜。在可能的情況下,combine的目的就是聚合並精簡數據。
方法3:採用Map Join,儘量避免Reduce Join。

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