天天看點

Hadoop的企業級優化

        在想辦法對Hadoop進行優化時,我們應該從Hadoop存在的一些問題來着手。

一、Hadoop的一些問題

MapReduce程式效率的瓶頸:

1、計算機性能

        包括CPU、記憶體、磁盤健康、網絡

2、I/O操作優化

(1)資料傾斜

(2)Map和Reduce數設定不合理

(3)Map運作時間太長,導緻Reduce等待過久

(4)小檔案過多

(5)大量的不可分塊的超大檔案

(6)Spill次數過多

(7)Merge次數過多

二、MapReduce的優化方法

        MapReduce優化方法主要從六個方面考慮:資料輸入、Map階段、Reduce階段、IO傳輸、資料傾斜問題和常用的調優參數。

2.1 資料輸入 InputFormat階段

(1)合并小檔案:在執行MR任務前将小檔案進行合并,大量的小檔案會産生大量的Map任務,增大Map任務裝載次數,而任務的裝載比較耗時,進而導緻MR運作較慢。

(2)采用CombineTextInputFormat來作為輸入,解決輸入端大量小檔案場景。

2.2 Map階段

(1)減少溢寫(Spill)次數:通過調整io.sort.mb(記憶體大小)及sort.spill.percent(溢出比例)參數值,增大觸發Spill的記憶體上限,減少Spill次數,進而減少磁盤IO。

(2)減少合并(Merge)次數:通過調整io.sort.factor參數,增大Merge的檔案數目,減少Merge的次數,進而縮短MR處理時間。

(3)在Map之後,不影響業務邏輯前提下,先進行Combine處理,減少I/O。

2.3 Reduce階段

(1)合理設定Map和Reduce數:兩個都不能設定太少,也不能設定太多。太少,會導緻Task等待,延長處理時間;太多,會導緻Map、Reduce任務間競争資源,造成處理逾時等錯誤。

(2)設定Map、Reduce共存:調整slowstart.completedmaps參數,使Map運作到一定程度後, Reduce也開始運作,減少Reduce的等待時間。

(3)規避使用Reduce:因為Reduce在用于連接配接資料集的時候将會産生大量的網絡消耗。

(4)合理設定Reduce端的Buffer:預設情況下,資料達到一個門檻值的時候, Buffer中的資料就會寫入磁盤,然後Reduce會從磁盤中獲得所有的資料。也就是說, Buffer和Reduce是沒有直接關聯的,中間多次寫磁盤-->讀磁盤的過程,既然有這個弊端,那麼就可以通過參數來配置,使得Bufer中的一部分資料可以直接輸送到 Reduce ,進而減少IO開銷︰mapreduce.reduce.input.bufer.percent,預設為0.0。當值大于0的時候,會保留指定比例的記憶體讀Buffer中的資料直接拿給Reduce使用。這樣一來,設定Buffer需要記憶體,讀取資料需要記憶體,Reduce計算也要記憶體,是以要根據作業的運作情況進行調整。

2.4 I/O傳輸

1)采用資料壓縮的方式,減少網絡IO的的時間。安裝Snappy和LZO壓縮編碼器。

2)使用SequenceFile二進制檔案。

         sequenceFile檔案時Hadoop中一種特殊檔案,它主要也是用來合并小檔案的,隻不過需要通過MR程式完成小檔案的合并,其中sequenceFile檔案需要通過SequenceFileOutputFormat輸出資料。

        注意:SequenceFile檔案的特點:是以檔案名為key,檔案内容為value輸出的

tips:Hadoop存檔的方法可以合并未進行MR的小檔案

2.5 資料傾斜

1、資料傾斜現象

資料頻率傾斜——某一個區域的資料量要遠遠大于其他區域。

資料大小傾斜——部分記錄的大小遠遠大于平均值。

2、減少資料傾斜的方法

方法1∶抽樣和範圍分區

可以通過對原始資料進行抽樣得到的結果集來預設分區邊界值。

方法2:自定義分區

基于輸出鍵的背景知識進行自定義分區。

方法3:Combine

使用Combine可以大量地減小資料傾斜。在可能的情況下,Combine的目的就是聚合并精簡資料。

方法4:

采用Map Join,盡量避免Reduce Join。

                                                                                                                                                貝

繼續閱讀