一、Yarn 架構
1.1 基本概念
Yarn 采用傳統的 master-slave 架構模式,其主要由 4 種組件組成,它們的主要功能如下:
- ResourceManager(RM):全局資源管理器,負責整個系統的資源管理和分配;
- 處理客戶端請求
- 啟動/監控ApplicationMaster
- 監控NodeManager
- 資源分配與調度
- ApplicationMaster(AM):負責應用程序(Application)的管理;
- 為應用程序申請資源,並分配給內部任務
- 任務調度、監控與容錯
- NodeManager(NM):負責 slave 節點的資源管理和使用;
- 單個節點上的資源管理
- 處理來自ResourceManger的命令
- 處理來自ApplicationMaster的命令
- Container(容器):對任務運行環境的一個抽象。

Yarn 架構圖
1.2 組件職責
ResourceManager (RM)
ResourceManager 是一個全局的資源管理器,負責整個系統的資源管理和分配。它主要由兩個組件組成:
- Scheduler:資源調度器,主要功能和特點如下:
- 負責將資源分配給各種正在運行的應用程序,這些應用程序受到容量、隊列等限制;
- Scheduler 是純調度程序,不會監視或跟蹤應用程序的狀態;
- 由於應用程序故障或硬件故障,它不提供有關重新啟動失敗任務的保證;
- Scheduler 根據應用程序的資源需求來執行其調度功能,它是基於資源容器的抽象概念來實現的,容器(Container)內包含內存、CPU、磁盤、網絡等因素;
- Scheduler 是一個可插拔的插件(即可配置),負責在各種隊列、應用程序等之間對集群資源進行區分。當前支持的Scheduler類包括:FairScheduler、FifoScheduler、CapacityScheduler;
- Application Manager:負責接受 job 提交請求,為應用程序分配第一個 Container 以運行 ApplicationMaster,並提供失敗時重新啟動運行着 ApplicationMaster 的 Container 的服務。
ApplicationMaster(AM)
當用戶提交一個應用程序時,將啟動一個被稱為 ApplcationMaster 的輕量級進程的實例,用以協調應用程序內所有任務的執行。它的主要工作包括:
- 向 ResourceManager 申請並以容器(Container)的形式提供計算資源;
- 管理在容器內運行的任務:
- 跟蹤任務的狀態並監視它們的執行;
- 遇到失敗時,重新啟動失敗的任務;
- 推測性的運行緩慢的任務以及計算應用計數器的總值。
NodeManager(NM)
NodeManager 進程運行在集群中的節點上,是每個節點上的資源和任務管理器。它的主要功能包括:
- 接收 ResourceManager 的資源分配請求,並為應用程序分配具體的 Container;
- 定時地向 ResourceManager 匯報本節點上的資源使用情況和各個 Container 的運行狀態,以確保整個集群平穩運行;
- 管理每個 Container 的生命周期;
- 管理每個節點上的日志;
- 接收並處理來自 ApplicationMaster 的 Container 啟動/停止等請求。
Container(容器)
Container 是 Yarn 中的資源抽象,是執行具體應用的基本單位,它包含了某個 NodeManager 節點上的多維度資源,如內存、CPU、磁盤和網絡 IO,當然目前僅支持內存和 CPU。任何一個 Job 或應用程序必須運行在一個或多個 Container 中,在 Yarn 中,ResourceManager 只負責告訴 ApplicationMaster 哪些 Containers 可以用,ApplicationMaster 需要自己去找 NodeManager 請求分配具體的 Container。
Container 和集群節點的關系是:一個節點會運行多個 Container,但一個 Container 不會跨節點。
二、Yarn 任務提交流程

Yarn 任務執行流程圖
Yarn 任務執行流程主要包括如下幾個步驟:
- 客戶端向 RM 發出請求;
- RM 返回一個 ApplicationID 作為回應;
- 客戶端向 RM 回應 Application Submission Context(ASC)和 Container Launch Context(CLC)信息。其中 ASC 包括 ApplicationID、user、queue,以及其它一些啟動 AM 相關的信息,CLC 包含了資源請求數(內存與CPU),Job 文件,安全 token,以及其它一些用於在 NM 上啟動 AM的信息;
- 當 ResourceManager 接受到 ASC 后,它會調度一個合適的 container 來啟動 AM,這個 container 經常被稱做 container 0。AM 需要請求其它的 container 來運行任務,如果沒有合適的 RM,AM 就不能啟動。當有合適的 container 時,RM 發請求到合適的 NM 上,來啟動 AM。這時候,AM 的 PRC 與監控的 URL 就已經建立了;
- 當 AM 啟動起來后,RM 回應給 AM 集群的最小與最大資源等信息。這時 AM 必須決定如何使用那么當前可用的資源。Yarm 不像那些請求固定資源的 scheduler,它能夠根據集群的當前狀態動態調整;
- AM 根據從 RM 那里得知的可使用的資源,它會請求一些一定數目的 container。這個請求可以是非常具體的包括具有多個資源最小值的 Container(例如額外的內存等);
- RM 將會根據調度策略,盡可能的滿足 AM 申請的 container;
- AM 根據分配的信息,去找NM啟動對應的 container。
【參考資料】