【Hadoop學習之Yarn】_27Yarn資源調度器

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

一、Yarn基本架構

Yarn主要由ResourceManagerNodeManagerApplicationMasterContainer等組件構成。
在這裏插入圖片描述

  1. ResourceManager(RM)的主要作用:

    (1)處理客戶端請求;

    (2)監控NodeManager

    (3)啓動或監控ApplicationMaster

    (4)資源的分配與調度。

  2. NodeManager(NM)的主要作用:

    (1)管理單個節點上的資源;

    (2)處理來自ResourceManager的命令;

    (3)處理來自ApplicationMaster的命令。

  3. ApplicationMaster(AM)的主要作用:

    (1)負責數據的切分;

    (2)爲應用程序申請資源並分配給內部的任務;

    (3)任務的監控與容錯

  4. Container的主要作用:

    Container是Yarn中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等。

二、Yarn工作機制

在這裏插入圖片描述

  1. MR程序提交到客戶端所在的節點。
  2. YarnRunnerResourceManager申請一個Application
  3. RM將該應用程序的資源路徑返回給YarnRunner
  4. 該程序將運行所需資源提交到HDFS
  5. 程序資源提交完畢後,申請運行mrAppMaster
  6. RM將用戶的請求初始化成一個Task
  7. 其中一個NodeManager領取到Task任務
  8. NodeManager創建容器Container,併產生MRAppmaster
  9. ContainerHDFS上拷貝資源到本地
  10. MRAppmaster向RM 申請運行MapTask資源
  11. RM將運行MapTask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務並創建容器
  12. MR向兩個接收到任務的NodeManager發送程序啓動腳本,這兩個NodeManager分別啓動MapTaskMapTask對數據分區排序
  13. MrAppMaster等待所有MapTask運行完畢後,向RM申請容器,運行ReduceTask
  14. ReduceTaskMapTask獲取相應分區的數據
  15. 程序運行完畢後,MR會向RM申請註銷自己。

三、job提交全過程

job提交過程之Yarn:
在這裏插入圖片描述

  1. 作業提交

    第1步:Client調用job.waitForCompletion方法,向整個集羣提交MapReduce作業。

    第2步:Client向RM申請一個作業id

    第3步:RMClient返回該job資源的提交路徑和作業id

    第4步:Client提交jar包、切片信息和配置文件到指定的資源提交路徑。

    第5步:Client提交完資源後,向RM申請運行MrAppMaster

  2. 作業初始化

    第6步:當RM收到Client的請求後,將該job添加到容量調度器中。

    第7步:某一個空閒的NM領取到該Job

    第8步:該NM創建Container,併產生MRAppmaster

    第9步:下載Client提交的資源到本地。

  3. 任務分配

    第10步:MrAppMaster向RM申請運行多個MapTask任務資源。

    第11步:RM將運行MapTask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務並創建容器。

  4. 任務運行

    第12步:MR向兩個接收到任務的NodeManager發送程序啓動腳本,這兩個NodeManager分別啓動MapTaskMapTask對數據分區排序。

    第13步:MrAppMaster等待所有MapTask運行完畢後,向RM申請容器,運行ReduceTask

    第14步:ReduceTaskMapTask獲取相應分區的數據。

    第15步:程序運行完畢後,MR會向RM申請註銷自己。

  5. 進度和狀態更新

    YARN中的任務將其進度和狀態(包括counter)返回給應用管理器, 客戶端每秒(通過mapreduce.client.progressmonitor.pollinterval設置)嚮應用管理器請求進度更新, 展示給用戶。

  6. 作業完成

    除了嚮應用管理器請求作業進度外, 客戶端每5秒都會通過調用waitForCompletion()來檢查作業是否完成。時間間隔可以通過mapreduce.client.completion.pollinterval來設置。作業完成之後, 應用管理器和Container會清理工作狀態。作業的信息會被作業歷史服務器存儲以備之後用戶覈查。

job提交過程之MapReduce:
在這裏插入圖片描述

四、資源調度器

目前,Hadoop作業調度器主要有三種:FIFOCapacity SchedulerFair SchedulerHadoop2.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
    在這裏插入圖片描述
    (1)支持多個隊列,每個隊列可配置一定的資源量,每個隊列採用FIFO調度策略。

    (2)爲了防止同一個用戶的作業獨佔隊列中的資源,該調度器會對同一用戶提交的作業所佔資源量進行限定。

    (3)首先,計算每個隊列中正在運行的任務數與其應該分得的計算資源之間的比值,選擇一個該比值最小的隊列——最閒的。

    (4)其次,按照作業優先級和提交時間順序,同時考慮用戶資源量限制和內存限制對隊列內任務排序。

    (5)三個隊列同時按照任務的先後順序依次執行,比如,job11job21job31分別排在隊列最前面,先運行,也是並行運行。

  3. 公平調度器(Fair Scheduler
    在這裏插入圖片描述
    (1)支持多隊列多用戶,每個隊列中的資源量可以配置,同一隊列中的作業公平共享隊列中所有資源。比如有三個隊列:queueAqueueBqueueC,每個隊列中的job按照優先級分配資源,優先級越高分配的資源越多,但是每個 job 都會分配到資源以確保公平。

    (2)在資源有限的情況下,每個job理想情況下獲得的計算資源與實際獲得的計算資源存在一種差距,這個差距就叫做缺額。

    (3)在同一個隊列中,job的資源缺額越大,越先獲得資源優先執行。作業是按照缺額的高低來先後執行的,而且可以看到上圖有多個作業同時運行。

五、任務的推測執行

  1. 作業完成時間取決於最慢的任務完成時間

    一個作業由若干個Map任務和Reduce任務構成。因硬件老化、軟件Bug等,某些任務可能運行非常慢。

    思考:系統中有99%Map任務都完成了,只有少數幾個Map老是進度很慢,完不成,怎麼辦?

  2. 推測執行機制

    發現拖後腿的任務,比如某個任務運行速度遠慢於任務平均速度。爲拖後腿任務啓動一個備份任務,同時運行。誰先運行完,則採用誰的結果。

  3. 執行推測任務的前提條件

    (1)每個Task只能有一個備份任務

    (2)當前Job已完成的Task必須不小於0.05(5%)

    (3)開啓推測執行參數設置,mapred-site.xml文件中默認是打開的。

    <property>
      	<name>mapreduce.map.speculative</name>
      	<value>true</value>
      	<description>If true, then multiple instances of some map tasks may be executed in parallel.</description>
    </property>
    
    <property>
      	<name>mapreduce.reduce.speculative</name>
      	<value>true</value>
      	<description>If true, then multiple instances of some reduce tasks may be executed in parallel.</description>
    </property>
    
  4. 不能啓用推測執行機制情況

    (1)任務間存在嚴重的負載傾斜;

    (2)特殊任務,比如任務向數據庫中寫數據。

  5. 推測執行算法原理

    假設某一時刻,任務T的執行進度爲progress,則可通過一定的算法推測出該任務的最終完成時刻estimateEndTime。另一方面,如果此刻爲該任務啓動一個備份任務,則可推斷出它可能的完成時刻estimateEndTime `,於是可得出以下幾個公式:

    estimatedRunTime =(currentTimestamp - taskStartTime)	/ progress
    推測運行時間(60s)  =(當前時刻(6- 任務啓動時刻(0))  / 任務運行比例(10%)
    
    estimateEndTime = estimatedRunTime + taskStartTime
    推測執行完時刻 60  = 推測運行時間(60s) + 任務啓動時刻(0)
    
    estimateEndTime` 	 =  currentTimestamp + averageRunTime
    備份任務推測完成時刻(16=  當前時刻(6+ 運行完成任務的平均時間(10s) 
    

    (1)MR總是選擇(estimateEndTime- estimateEndTime ` )差值最大的任務,併爲之啓動備份任務。

    (2)爲了防止大量任務同時啓動備份任務造成的資源浪費,MR爲每個作業設置了同時啓動的備份任務數目上限。

    (3)推測執行機制實際上採用了經典的優化算法:以空間換時間,它同時啓動多個相同任務處理相同的數據,並讓這些任務競爭以縮短數據處理時間。顯然,這種方法需要佔用更多的計算資源。在集羣資源緊缺的情況下,應合理使用該機制,爭取在多用少量資源的情況下,減少作業的計算時間。

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