Apache Hadoop YARN 的架構與運行流程。
YARN 概述
Yarn 是一個資源調度平臺,負責為運算程序提供服務器計算資源,相當於一個分佈式的操作系統平臺,而 MapReduce、Spark、Flink 等運行程序則相當於運行於操作系統平臺之上的應用程序。
YARN 產生的背景
Yarn 是 Hadoop2.X 版本中的一個新的特性。它的出現其實是為了解決第一代 MapReduce 編程框架的不足,提高集群環境下的資源利用率,這些資源包括了內存、磁盤、網絡等等。
Hadoop2.X 版本中重新設計的這個 YARN 集群,具有更好的擴展性,可用性,可靠性,向後兼容性,以 及能支持除 MapReduce 以外的更多分佈式計算框架。
在 MapReduce 1.x 時的架構圖如下:
從上圖可以看到,1.x 時也是 Master/Slave 這種主從結構,在集群上的表現就是一個JobTracker 和多個 TaskTracker。
- JobTracker:負責資源管理和作業調度
- TaskTracker:定期向 JobTracker 彙報本節點的健康狀況、資源使用情況以及作業執行情況。還可以接收來自JobTracker的命令,例如啟動任務或結束任務等。
那麼,這種架構會存在哪些問題?
- 整個集群中只有一個 JobTracker,存在單點故障。
- JobTracker 節點壓力大,不但要處理Client 的請求,還得處理 TaskTracker 的心跳等請求。
- 由於 JobTracker 是單節點,所以容易成為集群中的瓶頸,不易擴展。
- JobTracker 負責的事情太多,基本上所有的事情都需要跟 JobTracker 進行交互。
- 1.x 的整個集群只支持MapReduce 任務,不支持其他例如 Spark 的任務。
基於上面的種種原因,Hadoop 在 2.x 中對資源調度進行了剝離,形成了單獨的組件,也就是 Yarn 。
YARN 的架構
Yarn 的架構圖如下:
YARN 的基本思想是將資源管理和作業調度/監視的功能分解為單獨的守護進程。它擁有一個全局 ResourceManager(RM)和每個應用程序 ApplicationMaster(AM)。應用程序可以是單個作業,也可以是作業的DAG(有向無環圖,可以理解為對作業相互之間的依賴關係的一種描述)。
ResourceManager
ResourceManager 是基於應用程序對集群資源的需求進行調度的 YARN 集群主控節點,負責 協調和管理整個集群(所有 NodeManager)的資源,響應用戶提交的不同類型應用程序的 解析,調度,監控等工作。ResourceManager 會為每一個 Application 啟動一個 MRAppMaster, 並且 MRAppMaster 分散在各個 NodeManager 節點 它主要由兩個組件構成:調度器(Scheduler)和應用程序管理器(ApplicationsManager, ASM)
ResourceManager 的職責:
- 處理客戶端請求
- 啟動或監控 MRAppMaster
- 監控 NodeManager
- 資源的分配與調度
NodeManager
NodeManager是每臺機器框架代理,負責容器(Container)的管理,監視其資源使用情況(CPU,內存,磁盤,網絡)並將其報告給 ResourceManager / Scheduler。
NodeManager 的職責:
- 管理單個節點上的資源,開啟容器。
- 處理來自 ResourceManager 的命令
- 處理來自 MRAppMaster 的命令
ApplicationMaster
每個程序都對應一個 ApplicationMaster,它負責向資源調度器申請執行任務的資源容器,運行任務,監控整個任務的執行,跟蹤整個任務的狀態,處理任務失敗以異常情況。
Container
Container 容器是一個抽象出來的邏輯資源單位。容器是由 ResourceManager Scheduler 服務 動態分配的資源構成,它包括了該節點上的一定量 CPU,內存,磁盤,網絡等信息,MapReduce 程序的所有 Task 都是在一個容器裡執行完成的,容器的大小是可以動態調整的。
YARN 執行流程
先上圖,以 WordCount 的整個運行流程為例:
整個過程如下:
- 客戶端所在的機器 執行 job.submit() ,調用 YarnRunner 去向 ResourceManager 申請提交一個 application。
- ReourceManager 返回 一個 資源提交的地址 hdfs://xxx/.staging/application_id/ 和 application_id。因為後續的任務需要執行這些個資源文件,到這個階段,還不瞭解每個任務到底會分配到哪臺機器上,乾脆直接給一個都能訪問到的地址,任務到誰那裡,就自己去這個位置拉取需要的jar 包和 配置信息。
- YarnRunner 提交 job 所需要的 資源文件到上面的地址。
- YarnRunner 提交資源完畢,向 ResourceManager 申請啟動 MrAppMaster。
- ResourceManager 收到請求,然後封裝成一個 task 放入任務隊列,等待 NodeManager 獲取執行,此隊列默認使用FIFO。
- NodeManager1 把這次任務下載到本地。
- NodeManager1 下載 job 相關的文件,並在本地地啟動一個 Container 運行 MrAppMaster ,container 就是一個容器,利用的是 linux 的 cgroup ,現在市面上的虛擬化技術底層也是使用的此技術。
- MrAppMaster 根據配置信息,去跟 ResourceManager 申請運行 maptask 的容器,還是跟第 5 步一樣,ReourceManager 拿到後封裝成一個task 放到任務隊列。
- Nodemanager 2 和 3 分別下載 上個步驟的 task 任務 ,然後在本地啟動一個 container 容器。
- MrAppMaster 向 第9 步新啟動的 容器發送 拷貝文件、執行 maptask 等任務的命令。maptask 執行完成後,把數據寫到自己本地,容器的工作目錄。
- MrAppMaster 再向 YARN 請求資源來運行 reducetask 任務。
- reducetask 向 map 端獲取相應的分區數據進行處理 ,處理完成後進行輸出。
- 整個 applicetion 執行完成後,MrAppMaster 向 ResourceManager 申請銷燬自己。
Apache Hadoop YARN http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html
Hadoop學習之路(二十四)YARN的資源調度 https://www.cnblogs.com/qingyunzong/p/8615096.html
分佈式資源調度——YARN框架 https://blog.51cto.com/zero01/2091635
閱讀更多 科技伍小黑 的文章