1. 程式人生 > 實用技巧 >【MapReduce】六、Hadoop企業優化

【MapReduce】六、Hadoop企業優化

文章目錄

一、MapReduce 跑的慢的原因

  1. MapReduce程式效率的瓶頸在於兩點:
    1.1 計算機效能
    CPU、記憶體、磁碟健康、網路
    1.2 I/O 操作優化
    (1)資料傾斜
    (2)Map和Reduce數設定不合理
    (3)Map執行時間太長,導致Reduce等待過久(4)小檔案過多
    (5)大量的不可分塊的超大檔案(6)Spill次數過多
    (7) Merge次數過多等。

二、MapReduce優化方法

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

  1. 資料輸入
    (1)合併小檔案:在執行MR任務前將小檔案進行合併,大量的小檔案會產生大量的Map任務,增大Map任務裝載次數,而任務的裝載比較耗時,從而導致MR執行較慢。
    (2)採用CombineTextInputFormat來作為輸入,解決輸入端大量小檔案場景。
  2. Map階段
    (1)減少溢寫(Spill)次數:通過調整io.sort.mb及sort.spill.percent引數值,增大觸發Spill的記憶體上限,減少Spill次數,從而減少磁碟IO。
    (2)減少合併(Merge)次數:通過調整io.sort.factor引數,增大Merge的檔案數目,減少Merge的次數,從而縮短MR處理時間。
    (3)在Map之後,不影響業務邏輯前提下,先進行Combine處理,減少IO。
  3. Reduce階段
    (1)合理設定Map和Reduce數:兩個都不能設定太少,也不能設定太多。太少,會導致Task等待,延長處理時間;太多,會導致Map、Reduce任務間競爭資源,造成處理超時等錯誤。
    (2)設定Map、Reduce共存:調整slowstart.completedmaps引數,使Map執行到—定程度後,Reducet也開始執行,i減少Reduce的等待時間。
    (3規避使用Reduce:因為Reduce在用於連線資料集的時候將會產生大量的網路消耗。
    (4)合理設定Reduce端的Buffer:預設情況下,資料達到一個閾值的時候,Buffer中的資料就會寫入磁碟,然後Reduce會從磁碟中獲得所有的資料。也就是說,Buffer和Reduce是沒有直接關聯的,中間多次寫磁碟->讀磁碟的過程,既然有這個弊端,那麼就可以通過引數來配置,使得Buffer中的一部分資料可以直接輸送到Reduce,從而減少Io開銷: mapreducereduce.input buffer.percent,預設為0.0。當值大於0的時候,會保留指定比例的記憶體讀Buffer 中的資料直接拿給Reduce使用。這樣一來,設定Buffer需要記憶體,讀取資料需要記憶體,Reduce計算也要記憶體,所以要根據作業的執行情兄進行調整。
  4. I/O傳輸
    1)採用資料壓縮的方式,減少網路IO的的時間。安裝Snappy和LZO壓縮編碼器。
    2)使用SequenceFile二進位制檔案。
  5. 資料傾斜問題
    1)資料傾斜現象
    資料頻率傾斜——某一個區域的資料量要遠遠大於其他區域。
    資料大小傾斜——部分記錄的大小遠遠大於平均值。
    2)減少資料傾斜的方法
    方法1:抽樣和範圍分割槽
    可以通過對原始據進行抽樣得到的結果集來預設分割槽邊界值。
    方法2:自定義分割槽
    基於輸出鍵的背景知識進行自定義分割槽。例如,如果Map輸出鍵的單詞來源於一本書。且其中某幾個專業詞彙較多。那麼就可以自定義分割槽將這這些專業詞彙傳送給固定的一部分Reduce例項。而將其他的都發送給剩餘的Reduce例項。
    方法3:Conbine
    使用Combine可以大量地減小資料傾斜。在可能的情況下,Combine的目的就是聚合並精簡資料。
    方法4:採用Map Join,儘量避免Reduce Join。
  6. 常用的調優引數
    6.1 資源相關引數
    (1)以下引數是在使用者自己的MR應用程式中配置就可以生效(mapred-default.xml)
    在這裡插入圖片描述
    (2)應該在YARN啟動之前就配置在伺服器的配置檔案中才能生效(yarn-default.xml)
    在這裡插入圖片描述
    (3)Shuffle效能優化的關鍵引數,應在YARN啟動之前就配置好(mapred-default.xml)
    在這裡插入圖片描述
    6.2 容錯相關引數(MapReduce效能優化)
    在這裡插入圖片描述

三、HDFS小檔案優化方法

  1. HDFS小檔案弊端
    HDFS上每個檔案都要在NameNode上建立一個索引,這個索引的大小約為150byte,這樣當小檔案比較多的時候,就會產生很多的索引檔案,一方面會大量佔用NameNode的記憶體空間,另一方面就是索引檔案過大使得索引速度變慢。
  2. HDFS小檔案解決方案
    小檔案的優化無非以下幾種方式:
    (1)在資料採集的時候,就將小檔案或小批資料合成大檔案再上傳HDFS。
    Hadoop Archive是一個高效地將小檔案放入HDFS塊中的檔案存檔工具,它能夠將多個小檔案打包成一個HAR檔案,這樣就減少了NameNode的記憶體使用。

(2)在業務處理之前,在HDFS上使用MapReduce程式對小檔案進行合併。
Sequence File
Sequence File由一系列的二進位制key/value組成,如果key為檔名,value為檔案內容,則可以將大批小檔案合併成一個大檔案。

(3)在MapReduce處理時,可採用CombineTextInputFormat提高效率。
combineFilelnputFormat
CombineFileInputFormat是一種新的InputFormat,用於將多個檔案合併成一個單獨的split,另外,它會考慮資料的儲存位置。
(4)開啟JVM重用
對於大量小檔案Job,可以開啟JVM重用會減少45%執行時間。
JVM重用原理:一個Map執行在一個JVM上,開啟重用的話,該Map在JVM上執行完畢後,JVM繼續執行其他Map。
具體設定: maprechice.job.jvm.numtasks值在10-20之間。