1. 程式人生 > >hadoop之yarn詳解(基礎架構篇)

hadoop之yarn詳解(基礎架構篇)

本文主要從yarn的基礎架構和yarn的作業執行流程進行闡述

一、yarn的概述

       Apache Yarn(Yet Another Resource Negotiator的縮寫)是hadoop叢集資源管理器系統,Yarn從hadoop 2引入,最初是為了改善MapReduce的實現,但是它具有通用性,同樣執行其他分散式計算模式。

在MapReduce1中,具有如下侷限性:

1、擴充套件性差:jobtracker兼顧資源管理和作業控制跟蹤功能跟蹤任務,啟動失敗或遲緩的任務,記錄任務的執行狀態,維護計數器),壓力大,成為系統的瓶頸
2、可靠性差:採用了master/slave結構,master容易單點故障

3、資源利用率低:基於槽位的資源分配模型,槽位是一種粗粒度的資源劃分單位,通常一個任務不會用完一個槽位的資源,hadoop1分為map slot和reduce slot,而它們之間資源不共享,造成一些資源空閒。
4、不支援多框架:不支援多種計算框架並行

  yarn很好解決了MapReduce1中的侷限性:yarn基本思想;一個全域性的資源管理器resourcemanager和與每個應用對用的ApplicationMaster,Resourcemanager和NodeManager組成全新的通用系統,以分散式的方式管理應用程式。

所以針對MapReduce1,yarn就有了如下特點:

1、支援非mapreduce應用的需求
2、可擴充套件性
3、提高資源是用率
4、使用者敏捷性
5、可以通過搭建為高可用

二、yarn架構元件

        Yarn從整體上還是屬於master/slave模型,主要依賴於三個元件來實現功能,第一個就是ResourceManager,是叢集資源的仲裁者,它包括兩部分:一個是可插拔式的排程Scheduler,一個是ApplicationManager,用於管理叢集中的使用者作業。第二個是每個節點上的NodeManager,管理該節點上的使用者作業和工作流,也會不斷髮送自己Container使用情況給ResourceManager。第三個元件是ApplicationMaster,使用者作業生命週期的管理者它的主要功能就是向ResourceManager(全域性的)申請計算資源(Containers)並且和NodeManager互動來執行和監控具體的task。架構圖如下:

 

 

2.1、Resourcemanager 

    ResourceManager 擁有系統所有資源分配的決定權,負責叢集中所有應用程式的資源分配,擁有叢集資源主要、全域性檢視。因此為使用者提供公平的,基於容量的,本地化資源排程。根據程式的需求,排程優先順序以及可用資源情況,動態分配特定節點執行應用程式。它與每個節點上的NodeManager和每一個應用程式的ApplicationMaster協調工作。

   ResourceManager的主要職責在於排程,即在競爭的應用程式之間分配系統中的可用資源,並不關注每個應用程式的狀態管理。

   ResourceManager主要有兩個元件:Scheduler和ApplicationManager:Scheduler是一個資源排程器,它主要負責協調叢集中各個應用的資源分配,保障整個叢集的執行效率。Scheduler的角色是一個純排程器,它只負責排程Containers,不會關心應用程式監控及其執行狀態等資訊。同樣,它也不能重啟因應用失敗或者硬體錯誤而執行失敗的任務。

2.1.1、Scheduler

    Scheduler是一個可插拔的外掛,負責各個執行中的應用的資源分配,受到資源容量,佇列以及其他因素的影響。是一個純粹的排程器,不負責應用程式的監控和狀態追蹤,不保證應用程式的失敗或者硬體失敗的情況對task重啟,而是基於應用程式的資源需求執行其排程功能,使用了叫做資源container的概念,其中包括多種資源,比如,cpu,記憶體,磁碟,網路等。在Hadoop的MapReduce框架中主要有三種Scheduler:FIFO Scheduler,Capacity Scheduler和Fair Scheduler。

FIFO Scheduler:先進先出,不考慮作業優先順序和範圍,適合低負載叢集。
Capacity Scheduler:將資源分為多個佇列,允許共享叢集,有保證每個佇列最小資源的使用。
Fair Scheduler:公平的將資源分給應用的方式,使得所有應用在平均情況下隨著時間得到相同的資源份額。

2.1.2、ApplicationManager

    ApplicationManager主要負責接收job的提交請求,為應用分配第一個Container來執行ApplicationMaster,還有就是負責監控ApplicationMaster,在遇到失敗時重啟ApplicationMaster執行的Container

2.2、NodeManager

    NodeManager是yarn節點的一個“工作程序”代理,管理hadoop叢集中獨立的計算節點,主要負責與ResourceManager通訊,負責啟動和管理應用程式的container的生命週期,監控它們的資源使用情況(cpu和記憶體),跟蹤節點的監控狀態,管理日誌等。並報告給RM。

    NodeManager在啟動時,NodeManager向ResourceManager註冊,然後傳送心跳包來等待ResourceManager的指令,主要目的是管理resourcemanager分配給它的應用程式container。NodeManager只負責管理自身的Container,它並不知道執行在它上面應用的資訊。在執行期,通過NodeManager和ResourceManager協同工作,這些資訊會不斷被更新並保障整個叢集發揮出最佳狀態

主要職責:
1、接收ResourceManager的請求,分配Container給應用的某個任務
2、和ResourceManager交換資訊以確保整個叢集平穩執行。ResourceManager就是通過收集每個NodeManager的報告資訊來追蹤整個叢集健康狀態的,而NodeManager負責監控自身的健康狀態。
3、管理每個Container的生命週期
4、管理每個節點上的日誌
5、執行Yarn上面應用的一些額外的服務,比如MapReduce的shuffle過程

2.2.1、Container

     Container是Yarn框架的計算單元,是具體執行應用task(如map task、reduce task)的基本單位。Container和叢集節點的關係是:一個節點會執行多個Container,但一個Container不會跨節點。

   一個Container就是一組分配的系統資源,現階段只包含兩種系統資源(之後可能會增加磁碟、網路、GPU等資源),由NodeManager監控,Resourcemanager排程。

   每一個應用程式從ApplicationMaster開始,它本身就是一個container(第0個),一旦啟動,ApplicationMaster就會更加任務需求與Resourcemanager協商更多的container,在執行過程中,可以動態釋放和申請container。

2.3、ApplicationMaster

     ApplicationMaster負責與scheduler協商合適的container,跟蹤應用程式的狀態,以及監控它們的進度,ApplicationMaster是協調叢集中應用程式執行的程序。每個應用程式都有自己的ApplicationMaster,負責與ResourceManager協商資源(container)和NodeManager協同工作來執行和監控任務 。

    當一個ApplicationMaster啟動後,會週期性的向resourcemanager傳送心跳報告來確認其健康和所需的資源情況,在建好的需求模型中,ApplicationMaster在發往resourcemanager中的心跳資訊中封裝偏好和限制,在隨後的心跳中,ApplicationMaster會對收到叢集中特定節點上綁定了一定的資源的container的租約,根據Resourcemanager發來的container,ApplicationMaster可以更新它的執行計劃以適應資源不足或者過剩,container可以動態的分配和釋放資源。

三、yarn作業排程流程

Application在Yarn中的執行過程如下圖所示:

 

 

1、客戶端程式向ResourceManager提交應用並請求一個ApplicationMaster例項,ResourceManager在應答中給出一個applicationID以及有助於客戶端請求資源的資源容量資訊。

2、ResourceManager找到可以執行一個Container的NodeManager,並在這個Container中啟動ApplicationMaster例項

Application Submission Context發出響應,其中包含有:ApplicationID,使用者名稱,佇列以及其他啟動ApplicationMaster的資訊,
Container Launch Context(CLC)也會發給ResourceManager,CLC提供了資源的需求,作業檔案,安全令牌以及在節點啟動ApplicationMaster所需要的其他資訊。
當ResourceManager接收到客戶端提交的上下文,就會給ApplicationMaster排程一個可用的container(通常稱為container0)。然後ResourceManager就會聯絡NodeManager啟動ApplicationMaster,並建立ApplicationMaster的RPC埠和用於跟蹤的URL,用來監控應用程式的狀態。

3、ApplicationMaster向ResourceManager進行註冊,註冊之後客戶端就可以查詢ResourceManager獲得自己ApplicationMaster的詳細資訊,以後就可以和自己的ApplicationMaster直接互動了。在註冊響應中,ResourceManager會發送關於叢集最大和最小容量資訊,

4、在平常的操作過程中,ApplicationMaster根據resource-request協議向ResourceManager傳送resource-request請求,ResourceManager會根據排程策略儘可能最優的為ApplicationMaster分配container資源,作為資源請求的應答發個ApplicationMaster

5、當Container被成功分配之後,ApplicationMaster通過向NodeManager傳送container-launch-specification資訊來啟動Container, container-launch-specification資訊包含了能夠讓Container和ApplicationMaster交流所需要的資料,一旦container啟動成功之後,ApplicationMaster就可以檢查他們的狀態,Resourcemanager不在參與程式的執行,只處理排程和監控其他資源,Resourcemanager可以命令NodeManager殺死container,

6、應用程式的程式碼在啟動的Container中執行,並把執行的進度、狀態等資訊通過application-specific協議傳送給ApplicationMaster,隨著作業的執行,ApplicationMaster將心跳和進度資訊發給ResourceManager,在這些心跳資訊中,ApplicationMaster還可以請求和釋放一些container。

7、在應用程式執行期間,提交應用的客戶端主動和ApplicationMaster交流獲得應用的執行狀態、進度更新等資訊,交流的協議也是application-specific協議

8、一但應用程式執行完成並且所有相關工作也已經完成,ApplicationMaster向ResourceManager取消註冊然後關閉,用到所有的Container也歸還給系統,當container被殺死或者回收,Resourcemanager都會通知NodeManager聚合日誌並清理container專用的檔案。

 

更多hadoop生態文章見: hadoop生態系列

參考:

https://hadoop.apache.org/docs/r2.7.7/hadoop-yarn/hadoop-yarn-site/YARN.html

 

《hadoop yarn權威指