基本架構
概念解析
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申請的。
工作流程:
(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可能與它管理的任務運作在一個節點上。