【本文詳細介紹了Spark On Yarn 中Yarn運行過程和Yarn應用的實現,歡迎讀者朋友們閱讀、轉發和收藏!】
1. Yarn 的啟動流程
1.1 Yarn 啟動流程步驟
整體流程如下:
1. 提交應用及其使用到的資源
用戶向 YARN 中( RM )提交應用程式,其中包括 ApplicationMaster 程序、啟動 ApplicationMaster 的命令、用戶程序等。客戶端將應用程式所需的文件資源 ( 外部字典、 JAR 包、二進位文件等 ) 提交到 HDFS.
2. 啟動 ApplicationMaster
ResourceManager 為該應用程式分配第一個 Container ,並與對應的 NodeManager 通信,要求它在這個 Container 中啟動應用程式的 ApplicationMaster 。ApplicationMaster 與 ResouceManager 通信,以請求和獲取資源。ApplicationMaster 獲取到資源後,與對應的 NodeManager 通信以啟動任務。如果該應用程式第一次在給節點上啟動任務,則 NodeManager 首先從 HDFS 上下載文件緩存到本地,然後啟動該任務。
註:分布式緩存並不是將文件緩存到集群中各個結點的內存中,而是將文件換到各個結點的磁碟上,以便執行任務時候直接從本地磁碟上讀取文件。
3. 註冊應用
ApplicationMaster 首先向 ResourceManager 註冊,表明自己啟動成功,這樣用戶可以直接通過 ResourceManage 查看應用程式的運行狀態,然後它將為各個任務申請資源,並監控它的運行狀態,直到運行結束,即重複步驟 4~7 。
4. 為任務申請資源
ApplicationMaster 採用輪詢的方式通過 RPC 協議向 ResourceManager 申請和領取資源。
5. 與 NM 通信啟動各個任務
一旦 ApplicationMaster 申請到資源後, ApplicationMaster 就會將啟動命令交給 NodeManager, 要求它啟動任務。啟動命令裡包含了一些信息使得 Container 可以與 Application Master 進行通信。
6.NM 啟動任務
NodeManager 為任務設置好運行環境(包括環境變量、 JAR 包、二進位程序等)後,將任務啟動命令寫到一個腳本中,並通過運行該腳本啟動任務( Container )。
7. 執行任務
在 Container 內執行用戶提交的代碼,各個 Container 通過某個 RPC 協議向 ApplicationMaster 匯報自己的狀態和進度,以讓 ApplicationMaster 隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務。
8. 任務狀態查詢
在應用程式運行過程中,用戶可隨時通過 RPC 向 ApplicationMaster 查詢應用程式的當前運行狀態。
9. 運行完畢
應用程式運行完成後, ApplicationMaster 向 ResourceManager 註銷並關閉自己。
1.2 AM 與 RM 的詳細交互
1. 用戶向 YARN ResourceManager 提交應用程式, RM 收到提交申請後,先向資源調度器申請用以啟動 AM 的資源,待申請到資源後,再由 ApplicationMasterLauncher 與對應的 NodeManager 通信,從而啟動應用程式的 ApplicationMaster.
2.ApplicationMaster 啟動完成後, ApplicationMasterLaucher 會通過事件的形式,將剛剛啟動的 Application Master 註冊到 AMLiveMonitor ,以啟動心跳監控。
3.ApplicationMaster 啟動後,先向 ApplicatinMaterService 註冊,並將自己所在 host 、埠號等信息匯報給它。
4.AM 運行過程中,周期性地向 ApplicationMaserService 回報心跳信息(信息中包含想要申請的資源描述)。
5. ApplicationMasterService 每次收到 ApplicationMaster 心跳信息好後,將通知 AMLivelinessMonitor 更新應用程式的最新回報心跳的時間。
6. 應用程式運行完成後, AM 向 AMService 發送請求,註銷自己。
7.AMService 收到註銷請求後,標註應用程式運行狀態完成,同時通知 AMLivelinessMonitor 移除對它的心跳監控。
總結:
當用戶向 YARN 中提交一個應用程式後, YARN 將分兩個階段運行該應用程式:第一個階段是啟動
ApplicationMaster ;第二個階段是由 ApplicationMaster 創建應用程式,為它申請資源,並監控它的整個運行過程,直到運
行完成。
2.Yarn Application 的實現
2.1 Yarn application 中的角色和接口
Yarn 是一個資源管理系統,負責整個集群資源的管理和分配。如果需要在一個 yarn 集群上運行程序 :
首先得有個客戶端 client 來提交 job 到 ResourceManager(RM) 申請資源。Client 通過 RMProtocol 協議來與 RM 通信,將應用程式運行所需的一些信息,比如 local file/jars ,執行的命令,參數,環境變量等提供給 RM 來運行應用的第一個 container 也就是 ApplicationMaster(AppMaster) 。
如果申請到了資源, RM 就在第一個 container 上啟動 AppMaster 。AppMaster 然後通過 AMRMProtocol 協議與 ResourceManager 通訊,註冊自身,然後繼續申請資源。
如果獲得了 containers , AppMaster 會通過 ContainerManager 類與 NodeManager 通信,為任務啟動 container 。AppMaster 同時也會提供啟動 container 需要的一些信息,比如命令行,環境變量等。任務完成後, AppMaster 會通過 AMRMProtocol::finishApplicationMaster 來通知 RM 任務完成。同時, client 可以通過查詢 RM 來獲取 job 的狀態信息,或者如果 AppMaster 支持也可以直接從 AppMaster 查詢信息。如果需要, client 可以通過 ClientRMProtocol::forceKillApplication 來 kill 掉 application 。
三個角色
1. client 即客戶端,負責將應用程式提交到 RM 。
2. AppMaster 即整個應用程式的核心,負責與 RM 通信,申請資源,啟動 containers 。並監控 containers 的執行情況,在 container 執行失敗後做 failover 的處理。
3. container 就是具體幹活的,和具體業務相關的一些處理邏輯。
三個 RPC 協議
1. ClientRMProtocol(Client<–>ResourceManager) :客戶端與 RM 通信的協議,可以啟動 AppMater ,查詢或者 kill AppMaster 。
2. AMRMProtocol(ApplicationMaster<–>ResourceManager) :AppMaster 與 RM 通信, AppMaster 可以向 RM 註冊和註銷自己,也可以向 RM 申請資源以啟動 container 。
3. ContainerManager(ApplicationMaster<–> NodeManager) :AppMaster 與 NM 通信,可以啟動或者停止一個 container ,也可以獲取 container 的執行狀態。
我知道你在看喲