天天看點

yarn工作原理

基本架構

概念解析

1. ResourceManager

   ResourceManager是master上的程序,負責整個分布式系統的資源管理和排程。他會處理來自client端的請求(包括送出作業/殺死作業);啟動/監控Application Master;監控NodeManager的情況,比如可能挂掉的NodeManager。

2. NodeManager

   相對應的,NodeManager時處在slave節點上的程序,他隻負責目前slave節點的資源管理和排程,以及task的運作。他會定期向ResourceManager回報資源/Container的情況(heartbeat);接受來自ResourceManager對于Container的啟停指令。

3. Application Master

   每一個送出到叢集的作業都會有一個與之對應的Application Master來負責應用程式的管理。他負責進行資料切分;為目前應用程式向ResourceManager去申請資源(也就是Container),并配置設定給具體的任務;與NodeManager通信,用來啟停具體的任務,任務運作在Container中;而任務的監控和容錯也是由Application Master來負責的。

4. Container

   那麼container又是什麼呢?它包含了Application Master向ResourceManager申請的計算資源,比如說CPU/記憶體的大小,以及任務運作所需的環境變量和隊任務運作情況的描述。AM也是在container上運作的,不過AM的container是RM申請的。

工作流程:

yarn工作原理

(1)Client向ResourceManager送出作業(可以是Spark/Mapreduce作業)

(2)ResourceManager會為這個作業配置設定一個container

(3)ResourceManager與NodeManager通信,要求NodeManger在剛剛配置設定好的container上啟動應用程式的Application Master

(4)Application Master先去向ResourceManager注冊,而後ResourceManager會為各個任務申請資源,并監控運作情況

(5)Application Master采用輪詢(polling)方式向ResourceManager申請并領取資源(通過RPC協定通信)

 (6) Application Manager申請到了資源以後,就和NodeManager通信,要求NodeManager啟動任務

     最後,NodeManger啟動作業對應的任務。  

 工作機制

(0)Mr 程式送出到用戶端所在的節點。

(1)Yarnrunner 向 Resourcemanager 申請一個 Application。

(2)rm 将該應用程式的資源路徑傳回給 yarnrunner。

(3)該程式将運作所需資源送出到 HDFS 上。

(4)程式資源送出完畢後,申請運作 mrAppMaster。

(5)RM 将使用者的請求初始化成一個 task。

(6)其中一個 NodeManager 領取到 task 任務。

(7)該 NodeManager 建立容器 Container,并産生 MRAppmaster。

(8)Container 從 HDFS 上拷貝資源到本地。

(9)MRAppmaster 向 RM 申請運作 maptask 資源。

(10)RM 将運作 maptask 任務配置設定給另外兩個 NodeManager,另兩個 NodeManager 分

别領取任務并建立容器。

(11)MR 向兩個接收到任務的 NodeManager 發送程式啟動腳本,這兩個 NodeManager

分别啟動 maptask,maptask 對資料分區排序。

(12)MrAppMaster 等待所有 maptask 運作完畢後,向 RM 申請容器,運作 reduce task。

(13)reduce task 向 maptask 擷取相應分區的資料。

(14)程式運作完畢後,MR 會向 RM 申請登出自己。

了解重點:

1.  Container是YARN中資源的抽象,它封裝了某個節點上一定量的資源(CPU和記憶體兩類資源)。

2.  Container由ApplicationMaster向ResourceManager申請的,由ResouceManager中的資源排程器異步配置設定給ApplicationMaster;

3. Container的運作是由ApplicationMaster向資源所在的NodeManager發起的,Container運作時需提供内部執行的任務指令(可以是任何指令,比如java、Python、C++程序啟動指令均可)以及該指令執行所需的環境變量和外部資源(比如詞典檔案、可執行檔案、jar包等)。

另外,一個應用程式所需的Container分為兩大類,如下:

      (1) 運作ApplicationMaster的Container:這是由ResourceManager(向内部的資源排程器)申請和啟動的,使用者送出應用程式時,可指定唯一的ApplicationMaster所需的資源;

      (2) 運作各類任務的Container:這是由ApplicationMaster向ResourceManager申請的,并由ApplicationMaster與NodeManager通信以啟動之。

以上兩類Container可能在任意節點上,它們的位置通常而言是随機的,即ApplicationMaster可能與它管理的任務運作在一個節點上。

上一篇: Redis入門