【MapReduce】六、Hadoop企業優化
阿新 • • 發佈:2021-01-15
文章目錄
一、MapReduce 跑的慢的原因
- 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)合併小檔案:在執行MR任務前將小檔案進行合併,大量的小檔案會產生大量的Map任務,增大Map任務裝載次數,而任務的裝載比較耗時,從而導致MR執行較慢。
(2)採用CombineTextInputFormat來作為輸入,解決輸入端大量小檔案場景。 - Map階段
(1)減少溢寫(Spill)次數:通過調整io.sort.mb及sort.spill.percent引數值,增大觸發Spill的記憶體上限,減少Spill次數,從而減少磁碟IO。
(2)減少合併(Merge)次數:通過調整io.sort.factor引數,增大Merge的檔案數目,減少Merge的次數,從而縮短MR處理時間。 - 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計算也要記憶體,所以要根據作業的執行情兄進行調整。 - I/O傳輸
1)採用資料壓縮的方式,減少網路IO的的時間。安裝Snappy和LZO壓縮編碼器。
2)使用SequenceFile二進位制檔案。 - 資料傾斜問題
1)資料傾斜現象
資料頻率傾斜——某一個區域的資料量要遠遠大於其他區域。
資料大小傾斜——部分記錄的大小遠遠大於平均值。
2)減少資料傾斜的方法
方法1:抽樣和範圍分割槽
可以通過對原始據進行抽樣得到的結果集來預設分割槽邊界值。
方法2:自定義分割槽
基於輸出鍵的背景知識進行自定義分割槽。例如,如果Map輸出鍵的單詞來源於一本書。且其中某幾個專業詞彙較多。那麼就可以自定義分割槽將這這些專業詞彙傳送給固定的一部分Reduce例項。而將其他的都發送給剩餘的Reduce例項。
方法3:Conbine
使用Combine可以大量地減小資料傾斜。在可能的情況下,Combine的目的就是聚合並精簡資料。
方法4:採用Map Join,儘量避免Reduce Join。 - 常用的調優引數
6.1 資源相關引數
(1)以下引數是在使用者自己的MR應用程式中配置就可以生效(mapred-default.xml)
(2)應該在YARN啟動之前就配置在伺服器的配置檔案中才能生效(yarn-default.xml)
(3)Shuffle效能優化的關鍵引數,應在YARN啟動之前就配置好(mapred-default.xml)
6.2 容錯相關引數(MapReduce效能優化)
三、HDFS小檔案優化方法
- HDFS小檔案弊端
HDFS上每個檔案都要在NameNode上建立一個索引,這個索引的大小約為150byte,這樣當小檔案比較多的時候,就會產生很多的索引檔案,一方面會大量佔用NameNode的記憶體空間,另一方面就是索引檔案過大使得索引速度變慢。 - 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之間。