Hadoop生態圈(四):Yarn

目錄

1 Yarn

1.1 Yarn概述

1.2 Yarn基本結構

1.3 Yarn工作機制

1.4 資源調度器

2 hadoop企業優化

2.1  MapReduce跑的慢的原因

2.2 MapReduce優化方法

2.2.1 數據輸入

2.2.2 Map階段

2.2.3 Reduce階段

2.2.4 數據傾斜問題

3 常見錯誤及解決方案


1 Yarn

1.1 Yarn概述

Yarn是一個資源調度平臺,負責爲運算程序調度服務器運算資源,相當於一個分佈式的操作系統平臺,而MapReduce等運算程序相當於運算在操作系統上的應用程序

1.2 Yarn基本結構

Yarn主要有ResourceManager、NodeManager、ApplicationMaster和Container等組件構成

1) ResourceManager(rm):處理客戶端請求、啓動/監控ApplicationMaster、監控NodeManager、資源分配與調度;

2)NodeManager(nm):單個節點上的資源管理、處理來自ResourceManager的命令、處理來自ApplicationMaster的命令;

3)ApplicationMaster:數據切分、爲應用程序申請資源,並分配給內部任務、任務監控與容錯。

4)Container:對任務運行環境的抽象,封裝了CPU、內存等多維資源以及環境變量、啓動命令等任務運行相關的信息。

1.3 Yarn工作機制

 

工作機制詳細流程:

  1. 先將MR程序提交到客戶端所在節點,準備運行MR
  2. Yarnrunner向ResourceManager申請啓動一個Application
  3. RM將該應用程序所需要的資源路徑返回給yarnrunner
  4. 該程序將運行所需要的資源信息提及到HDFS上
  5. 程序資源信息提交完畢之後,申請運行MrApplicationMaster
  6. RM將及用戶的請求初始化爲一個task放入任務隊列中
  7. 一個NodeManager領取到task任務
  8. 該NodeManager節點創建容器Container,併產生一個MrApplicationMaster
  9. Container從HDFS上將該task'所需要的資源信息拷貝到本地
  10. MrApplicationMaster向RM申請運行maptask所需要的資源
  11. MR將運行maptask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務創建Container容器
  12. MrApplicationMaster向兩個接受到任務的NodeManager發送程序啓動腳本,這兩個NodeManager分別啓動maptask,maptask對數據進行處理
  13. MrApplicationMaster等所有的maptask運行完畢之後,向RM申請容器、資源,運行reduce task
  14. reduce task 向maptask獲取對應的分區的數據
  15. 程序運行完畢之後。MR向RM申請註銷

1.4 資源調度器

目前,Hadoop作業調度器主要有三種:FIFO、Capacity Scheduler和Fair Scheduler。Hadoop2.7.2默認的資源調度器是Capacity Scheduler。具體設置詳見:yarn-default.xml

<property>

         <description>The class to use as the resource scheduler.</description>

         <name>yarn.resourcemanager.scheduler.class</name>

         <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>

</property>

1. 先進先出調度器(FIFO)

 

2. 容量調度器(Capacity Scheduler)

 

3. 公平調度器(Fair Scheduler)

 

2 hadoop企業優化

2.1  MapReduce跑的慢的原因

Mapreduce 程序效率的瓶頸在於兩點:

1.計算機性能

CPU、內存、磁盤健康、網絡

2.I/O 操作優化

(1)數據傾斜

(2)map和reduce數設置不合理 combineTextinputformat,分區

(3)map運行時間太長,導致reduce等待過久

(4)小文件過多

(5)spill(溢出)次數過多,溢出數據到磁盤,

(6)merge次數過多等。Shuffule,溢出之後會有合併,reduce端也會有合併

2.2 MapReduce優化方法

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

2.2.1 數據輸入

(1)合併小文件:在執行mr任務前將小文件進行合併,大量的小文件會產生大量的map任務,大量節點資源被佔用,從而導致mr整體運行較慢。

(2)採用CombineTextInputFormat來作爲輸入,解決輸入端大量小文件場景。

2.2.2 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。

2.2.3 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計算也要內存,所以要根據作業的運行情況進行調整。

2.2.4 數據傾斜問題

1.數據傾斜現象

數據頻率傾斜——某一個區域的數據量要遠遠大於其他區域。

2.如何收集傾斜數據

在reduce方法中加入記錄map輸出鍵的詳細情況的功能。

public static final String MAX_VALUES = "skew.maxvalues"; 
private int maxValueThreshold; 
 
@Override
public void configure(JobConf job) { 
     maxValueThreshold = job.getInt(MAX_VALUES, 100); 
} 
@Override
public void reduce(Text key, Iterator<Text> values,
                     OutputCollector<Text, Text> output, 
                     Reporter reporter) throws IOException {
     int i = 0;
     while (values.hasNext()) {
         values.next();
         i++;
     }

     if (++i > maxValueThreshold) {
         log.info("Received " + i + " values for key " + key);
     }
}

3.減少數據傾斜的方法

方法1:自定義分區

基於輸出鍵的背景知識進行自定義分區。例如,如果map輸出鍵的單詞來源於一本書。且其中某幾個專業詞彙較多。那麼就可以自定義分區將這這些專業詞彙發送給固定的一部分reduce實例。而將其他的都發送給剩餘的reduce實例。

方法2:Combine

使用Combine可以大量地減小數據傾斜。在可能的情況下,combine的目的就是聚合並精簡數據。

方法3採用Map Join,儘量避免Reduce Join

3 常見錯誤及解決方案

1) 導包容易出錯。尤其Text和CombineTextInputFormat。

2) Mapper中第一個輸入的參數必須是LongWritable或者NullWritable,不可以是IntWritable.  報的錯誤是類型轉換異常。

3)  java.lang.Exception: java.io.IOException: Illegal partition for 13926435656 (4),說明partition和reducetask個數沒對上,調整reducetask個數。

4) 如果分區數不是1,但是reducetask爲1,是否執行分區過程。答案是:不執行分區過程。因爲在maptask的源碼中,執行分區的前提是先判斷reduceNum個數是否大於1。不大於1肯定不執行。

5)在Windows環境編譯的jar包導入到linux環境中運行,

hadoop jar wc.jar com.bigdata.mapreduce.wordcount.WordCountDriver /user/bigdata/ /user/bigdata/output

報如下錯誤:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/bigdata/mapreduce/wordcount/WordCountDriver : Unsupported major.minor version 52.0

原因是Windows環境用的jdk1.7,linux環境用的jdk1.8。

解決方案:統一jdk版本。

6)緩存pd.txt小文件案例中,報找不到pd.txt文件

原因:大部分爲路徑書寫錯誤。還有就是要檢查pd.txt的問題。還有個別電腦寫相對路徑找不到pd.txt,可以修改爲絕對路徑。

7)報類型轉換異常。

通常都是在驅動函數中設置map輸出和最終輸出時編寫錯誤。Map輸出的key如果沒有排序,也會報類型轉換異常。

8)集羣中運行wc.jar時出現了無法獲得輸入文件。

原因:wordcount案例的輸入文件不能放在hdfs集羣的根目錄。

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