01.28 Apache Hadoop YARN 的架構與運行流程

Apache Hadoop YARN 的架構與運行流程。

YARN 概述

Yarn 是一個資源調度平臺,負責為運算程序提供服務器計算資源,相當於一個分佈式的操作系統平臺,而 MapReduce、Spark、Flink 等運行程序則相當於運行於操作系統平臺之上的應用程序。

YARN 產生的背景

Yarn 是 Hadoop2.X 版本中的一個新的特性。它的出現其實是為了解決第一代 MapReduce 編程框架的不足,提高集群環境下的資源利用率,這些資源包括了內存、磁盤、網絡等等。

Hadoop2.X 版本中重新設計的這個 YARN 集群,具有更好的擴展性,可用性,可靠性,向後兼容性,以 及能支持除 MapReduce 以外的更多分佈式計算框架。

在 MapReduce 1.x 時的架構圖如下:

Apache Hadoop YARN 的架構與運行流程

從上圖可以看到,1.x 時也是 Master/Slave 這種主從結構,在集群上的表現就是一個JobTracker 和多個 TaskTracker。

  • JobTracker:負責資源管理和作業調度
  • TaskTracker:定期向 JobTracker 彙報本節點的健康狀況、資源使用情況以及作業執行情況。還可以接收來自JobTracker的命令,例如啟動任務或結束任務等。

那麼,這種架構會存在哪些問題?

  1. 整個集群中只有一個 JobTracker,存在單點故障。
  2. JobTracker 節點壓力大,不但要處理Client 的請求,還得處理 TaskTracker 的心跳等請求。
  3. 由於 JobTracker 是單節點,所以容易成為集群中的瓶頸,不易擴展。
  4. JobTracker 負責的事情太多,基本上所有的事情都需要跟 JobTracker 進行交互。
  5. 1.x 的整個集群只支持MapReduce 任務,不支持其他例如 Spark 的任務。

基於上面的種種原因,Hadoop 在 2.x 中對資源調度進行了剝離,形成了單獨的組件,也就是 Yarn 。

YARN 的架構

Yarn 的架構圖如下:

Apache Hadoop YARN 的架構與運行流程

YARN 的基本思想是將資源管理和作業調度/監視的功能分解為單獨的守護進程。它擁有一個全局 ResourceManager(RM)和每個應用程序 ApplicationMaster(AM)。應用程序可以是單個作業,也可以是作業的DAG(有向無環圖,可以理解為對作業相互之間的依賴關係的一種描述)。

ResourceManager

ResourceManager 是基於應用程序對集群資源的需求進行調度的 YARN 集群主控節點,負責 協調和管理整個集群(所有 NodeManager)的資源,響應用戶提交的不同類型應用程序的 解析,調度,監控等工作。ResourceManager 會為每一個 Application 啟動一個 MRAppMaster, 並且 MRAppMaster 分散在各個 NodeManager 節點  它主要由兩個組件構成:調度器(Scheduler)和應用程序管理器(ApplicationsManager, ASM)

ResourceManager 的職責:

  1. 處理客戶端請求    
  2. 啟動或監控 MRAppMaster    
  3. 監控 NodeManager    
  4. 資源的分配與調度

NodeManager

NodeManager是每臺機器框架代理,負責容器(Container)的管理,監視其資源使用情況(CPU,內存,磁盤,網絡)並將其報告給 ResourceManager / Scheduler。

NodeManager 的職責:    

  1. 管理單個節點上的資源,開啟容器。
  2. 處理來自 ResourceManager 的命令    
  3. 處理來自 MRAppMaster 的命令

ApplicationMaster

每個程序都對應一個 ApplicationMaster,它負責向資源調度器申請執行任務的資源容器,運行任務,監控整個任務的執行,跟蹤整個任務的狀態,處理任務失敗以異常情況。

Container

Container 容器是一個抽象出來的邏輯資源單位。容器是由 ResourceManager Scheduler 服務 動態分配的資源構成,它包括了該節點上的一定量 CPU,內存,磁盤,網絡等信息,MapReduce 程序的所有 Task 都是在一個容器裡執行完成的,容器的大小是可以動態調整的。

YARN 執行流程

先上圖,以 WordCount 的整個運行流程為例:


Apache Hadoop YARN 的架構與運行流程


整個過程如下:

  1. 客戶端所在的機器 執行 job.submit() ,調用 YarnRunner 去向 ResourceManager 申請提交一個 application。
  2. ReourceManager 返回 一個 資源提交的地址 hdfs://xxx/.staging/application_id/ 和 application_id。因為後續的任務需要執行這些個資源文件,到這個階段,還不瞭解每個任務到底會分配到哪臺機器上,乾脆直接給一個都能訪問到的地址,任務到誰那裡,就自己去這個位置拉取需要的jar 包和 配置信息。
  3. YarnRunner 提交 job 所需要的 資源文件到上面的地址。
  4. YarnRunner 提交資源完畢,向 ResourceManager 申請啟動 MrAppMaster。
  5. ResourceManager 收到請求,然後封裝成一個 task 放入任務隊列,等待 NodeManager 獲取執行,此隊列默認使用FIFO。
  6. NodeManager1 把這次任務下載到本地。
  7. NodeManager1 下載 job 相關的文件,並在本地地啟動一個 Container 運行 MrAppMaster ,container 就是一個容器,利用的是 linux 的 cgroup ,現在市面上的虛擬化技術底層也是使用的此技術。
  8. MrAppMaster 根據配置信息,去跟 ResourceManager 申請運行 maptask 的容器,還是跟第 5 步一樣,ReourceManager 拿到後封裝成一個task 放到任務隊列。
  9. Nodemanager 2 和 3 分別下載 上個步驟的 task 任務 ,然後在本地啟動一個 container 容器。
  10. MrAppMaster 向 第9 步新啟動的 容器發送 拷貝文件、執行 maptask 等任務的命令。maptask 執行完成後,把數據寫到自己本地,容器的工作目錄。
  11. MrAppMaster 再向 YARN 請求資源來運行 reducetask 任務。
  12. reducetask 向 map 端獲取相應的分區數據進行處理 ,處理完成後進行輸出。
  13. 整個 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


分享到:


相關文章: