大資料開發新手入門11——Hadoop最佳化

歡迎大家關注,大資料開發小白入門群:QQ:699479439 課程內容來源於“開課吧”大資料課程

本節課,是我們最後一節介紹Hadoop的課程,在下一節課中,我們將開始介紹HIVE(終於有一個可以上手的東西了)。在前面的幾節課中,大家可以看到實際上手的東西並不多,其實在實際工作中,如果只是一般的資料分,大資料應用開發等,基本上是不會涉及這些問題的,但是,大家要知道這些概念,如果要真正涉及大資料平臺的開發,那一定需要深入要學習這方面的知識,本人也是初學者,所以,也只能照本宣科的做一些簡單介紹,有興趣的可以在網上多查查資料,做進一步的學習。比如,我們上一節課中的YARN,其實還有很多內容我們提及,比如YARN的三種排程器,應用YARN來進行資源隔離等等,以後作為高階開發人員,這些是必須要掌握和了解的。

好了,我們今天簡單介紹一下在實際工作中,關於Hadoop一些簡單的調優方法,不用記住,但要知道。

友情提醒:我們第一節課搭建好的虛擬機器,及時做好備份哦,如果你想試一試調優,以及後面的課,都有可能把叢集環境中的配置檔案弄錯,所以

最好及時把虛擬機器做好快照。

1。 hdfs調優以及yarn引數調優

1。 HDFS引數調優hdfs-site。xml

dfs。namenode。handler。count=20 * log2(Cluster Size)調整namenode處理客戶端的執行緒數比如叢集規模為8臺時,此引數設定為60The number of Namenode RPC server threads that listen to requests from clients。 If dfs。namenode。servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes。NameNode有一個工作執行緒池,用來處理不同DataNode的併發心跳以及客戶端併發的元資料操作。對於大叢集或者有大量客戶端的叢集來說,通常需要增大引數dfs。namenode。handler。count的預設值10。設定該值的一般原則是將其設定為叢集大小的自然對數乘以20,即20logN,N為叢集大小。

編輯日誌儲存路徑dfs。namenode。edits。dir設定與映象檔案儲存路徑dfs。namenode。name。dir儘量分開,達到最低寫入延遲

元資料資訊fsimage多目錄冗餘儲存配置

2。 YARN引數調優yarn-site。xml

根據實際調整每個節點和單個任務申請記憶體值yarn。nodemanager。resource。memory-mb表示該節點上YARN可使用的物理記憶體總量,預設是8192(MB),注意,如果你的節點記憶體資源不夠8GB,則需要調減小這個值,而YARN不會智慧的探測節點的物理記憶體總量。yarn。scheduler。maximum-allocation-mb單個任務可申請的最多物理記憶體量,預設是8192(MB)。

Hadoop宕機如果MR造成系統宕機。此時要控制Yarn同時執行的任務數,和每個任務申請的最大記憶體。調整引數:yarn。scheduler。maximum-allocation-mb(單個任務可申請的最多物理記憶體量,預設是8192MB)如果寫入檔案過量造成NameNode宕機。那麼調高Kafka的儲存大小,控制從Kafka到HDFS的寫入速度。高峰期的時候用Kafka進行快取,高峰期過去資料同步會自動跟上。

2。 mapreduce執行慢的主要原因可能有哪些

MapReduce程式效率的瓶頸在於兩點:

一、計算機效能CPU、記憶體、磁碟健康、網路

二、I/O操作最佳化資料傾斜map和reduce數設定不合理map執行時間太長,導致reduce等待過久小檔案過多大量的不可分割的超大檔案spill次數過多merge次數過多

3。 mapreduce的最佳化方法

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

1。 資料輸入階段

合併小檔案:在執行mr任務前將小檔案進行合併;因為大量的小檔案會產生大量的map任務,任務都需要初始化,從而導致mr執行緩慢

採用CombineTextInputFormat來作為輸入,解決輸入端大量小檔案場景。

2。 MapTask執行階段

減少spill溢寫次數

:透過調整mapreduce。task。io。sort。mb及mapreduce。map。sort。spill。percent引數的值,增大觸發spill的記憶體上限,減少spill次數,從而減少磁碟io的次數

減少merge合併次數

:調整mapreduce。task。io。sort。factor引數,增大merge的檔案數,減少merge的次數,從而縮短mr處理時間

在map之後,不影響業務邏輯的情況下,先進行combine處理,減少I/O

3。 ReduceTask執行階段

設定合理的map、reduce個數

:兩個數值都不能太小,也不能太大;太少,導致task執行時長變長;太多,導致map、reduce任務間競爭資源,造成處理超時錯誤。

設定map、reduce共存

:調整mapreduce。job。reduce。slowstart。completedmaps引數(預設0。05),是map執行到一定程度後,reduce也開始執行,減少reduce的等待時間比如調到0。8

規避使用reduce

:因為reduce在用於連線資料集的時候會產生大量的網路消耗

合理設定reduce端的buffer

:預設情況下,資料達到一定閾值的時候,Buffer中的資料會寫入磁碟,然後reduce會從磁碟中獲得所有的資料。即Buffer與reduce沒有關聯的,中間多次寫磁碟、讀磁碟的過程。那麼可以透過調整引數,使得Buffer中的資料可以直接輸送到reduce,從而減少I/O開銷;mapreduce。reduce。input。buffer。percent預設為0。0,當值大於0的時候,會保留指定比例的記憶體讀Buffer中的數值直接拿給Reducer使用。這樣一來,設定Buffer需要記憶體,讀取資料需要記憶體,Reduce計算也需要記憶體,所以要根據作業的執行情況進行調整。

4。 IO傳輸階段

進行資料壓縮

:減少網路I/O的資料量,安裝snappy和lzo壓縮編碼器

使用SequenceFile二進位制檔案

5。 資料傾斜問題

資料傾斜現象:資料頻率傾斜—— 某一分割槽的資料量要遠遠大於其他分割槽資料大小傾斜—— 部分記錄的大小遠遠大於平均值

減少資料傾斜的方法方法1:抽樣和範圍分割槽對原始資料進行抽樣,根據抽樣資料集,預設分割槽邊界值方法2:自定義分割槽基於map輸出key的背景知識,進行自定義分割槽。例如,如果map輸出鍵的單詞來源於一本書,且其中某些專業詞彙出現的次數比較多,那麼就可以自定義分割槽將這些專業詞彙傳送給固定的若干reduce任務。而將其他的都發送給剩餘的reduce任務方法3:Combine使用combine減少資料傾斜。在可能的情況下,Combine的目的是聚合並精簡資料方法4:採用Map Join,儘量避免Reduce Join

4。 hdfs小檔案解決方案總結

1。 小檔案的問題弊端

HDFS上每個檔案都要在NameNode上建立一個索引,這個索引的大小約為150byte,這樣當小檔案比較多的時候,就會產生很多的索引檔案

一方面會大量佔用NameNode的記憶體空間,另一方面就是索引檔案過大使得索引速度變慢。

2。 小檔案的解決方案

最佳化方式:方式一:在資料採集的時候,就將小檔案或小批資料合成大檔案再上傳HDFS。方式二:在業務處理之前,在HDFS上使用MapReduce程式對小檔案進行合併。方式三:在MapReduce處理時,可採用CombineTextInputFormat提高效率。

歸檔命令:hadoop archive高效地將小檔案進行歸檔的工具,能將多個小檔案打包成一個HAR檔案,這樣就減少了NameNode的記憶體使用

利用sequence file作為小檔案的容器Sequence File由一系列的二進位制的key/value組成,如果key為檔名,value為檔案內容,則可以將大量小檔案合併到一個SequenceFile檔案中

CombineFileInputFormatCombineFileInputFormat用於將多個檔案合併成一個單獨的split,並且會考慮資料的儲存位置。

開啟jvm重用對於處理大量小檔案的job,可以開啟jvm重用,約減少40%的執行時間jvm重用原理:一個map執行在一個jvm上,開啟重用的話,該map在jvm上執行完畢後,此jvm中會繼續執行此job的其他map任務具體設定:mapreduce。job。jvm。numtasks值在10到20之間