深入理解Yarn的架構及作業排程機制

caixingyun發表於2017-02-14

來自:http://blog.csdn.net/u010330043/article/details/51223108

一、YARN 架構由什麼組成?

首先我們來看看 YARN 的架構圖,如下圖所示。 
從 YARN 的架構圖來看,它主要由ResourceManager、NodeManager、ApplicationMaster和Container等以下幾個元件構成。 
這裡寫圖片描述 
1、 ResourceManager(RM) 
  YARN 分層結構的本質是 ResourceManager。這個實體控制整個叢集並管理應用程式向基礎計算資源的分配。ResourceManager 將各個資源部分(計算、記憶體、頻寬等)精心安排給基礎 NodeManager(YARN 的每節點代理)。ResourceManager 還與 ApplicationMaster 一起分配資源,與 NodeManager 一起啟動和監視它們的基礎應用程式。在此上下文中,ApplicationMaster 承擔了以前的 TaskTracker 的一些角色,ResourceManager 承擔了 JobTracker 的角色。 
  
2、 ApplicationMaster(AM) 
  ApplicationMaster 管理一個在 YARN 內執行的應用程式的每個例項。ApplicationMaster 負責協調來自 ResourceManager 的資源,並通過 NodeManager 監視容器的執行和資源使用(CPU、記憶體等的資源分配)。請注意,儘管目前的資源更加傳統(CPU 核心、記憶體),但未來會帶來基於手頭任務的新資源型別(比如圖形處理單元或專用處理裝置)。從 YARN 角度講,ApplicationMaster 是使用者程式碼,因此存在潛在的安全問題。YARN 假設 ApplicationMaster 存在錯誤或者甚至是惡意的,因此將它們當作無特權的程式碼對待。

3、 NodeManager(NM) 
  NodeManager 管理一個 YARN 叢集中的每個節點。NodeManager 提供針對叢集中每個節點的服務,從**監督對一個容器的終生管理到監視資源和跟蹤節點健康。**MRv1 通過插槽管理 Map 和 Reduce 任務的執行,而 NodeManager 管理抽象容器,這些容器代表著可供一個特定應用程式使用的針對每個節點的資源。YARN 繼續使用 HDFS 層。它的主要 NameNode 用於後設資料服務,而 DataNode 用於分散在一個叢集中的複製儲存服務。 
4、 Container 
  Container 是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁碟、網路等,當AM向RM申請資源時,RM為AM返回的資源便是用Container表示的。YARN會為每個任務分配一個Container,且該任務只能使用該Container中描述的資源。

   要使用一個 YARN 叢集,首先需要來自包含一個應用程式的客戶的請求。ResourceManager 協商一個容器的必要資源,啟動一個 ApplicationMaster 來表示已提交的應用程式。通過使用一個資源請求協議,ApplicationMaster 協商每個節點上供應用程式使用的資源容器。執行應用程式時,ApplicationMaster 監視容器直到完成。當應用程式完成時,ApplicationMaster 從 ResourceManager 登出其容器,執行週期就完成了

  我們應該明確的一點是,舊的 Hadoop 架構受到了 JobTracker 的高度約束,JobTracker 負責整個叢集的資源管理和作業排程。新的 YARN 架構打破了這種模型,允許一個新 ResourceManager 管理跨應用程式的資源使用,ApplicationMaster 負責管理作業的執行。這一更改消除了一處瓶頸,還改善了將 Hadoop 叢集擴充套件到比以前大得多的配置的能力。此外,不同於傳統的 MapReduce,YARN 允許使用 Message Passing Interface 等標準通訊模式,同時執行各種不同的程式設計模型,包括圖形處理、迭代式處理、機器學習和一般叢集計算。

二、YARN的作業排程機制

YARN 的作業排程機制原理如下圖所示: 
這裡寫圖片描述

主要由以下幾個步驟組成: 
1. 作業提交

  client 呼叫job.waitForCompletion方法,向整個叢集提交MapReduce作業 (第1步) 。 新的作業ID(應用ID)由資源管理器分配(第2步). 作業的client核實作業的輸出, 計算輸入的split, 將作業的資源(包括Jar包, 配置檔案, split資訊)拷貝給HDFS(第3步). 最後, 通過呼叫資源管理器的submitApplication()來提交作業(第4步). 
2. 作業初始化

  當資源管理器收到submitApplciation()的請求時, 就將該請求發給排程器(scheduler), 排程器分配container, 然後資源管理器在該container內啟動應用管理器程式, 由節點管理器監控(第5a和5b步).

  MapReduce作業的應用管理器是一個主類為MRAppMaster的Java應用. 其通過創造一些bookkeeping物件來監控作業的進度, 得到任務的進度和完成報告(第6步). 然後其通過分散式檔案系統得到由客戶端計算好的輸入split(第7步). 然後為每個輸入split建立一個map任務, 根據mapreduce.job.reduces建立reduce任務物件. 
3. 任務分配

  如果作業很小, 應用管理器會選擇在其自己的JVM中執行任務。

  如果不是小作業, 那麼應用管理器向資源管理器請求container來執行所有的map和reduce任務(第8步). 這些請求是通過心跳來傳輸的, 包括每個map任務的資料位置, 比如存放輸入split的主機名和機架(rack). 排程器利用這些資訊來排程任務, 儘量將任務分配給儲存資料的節點, 或者退而分配給和存放輸入split的節點相同機架的節點. 
4. 任務執行

  當一個任務由資源管理器的排程器分配給一個container後, 應用管理器通過聯絡節點管理器來啟動container(第9a步和9b步). 任務由一個主類為YarnChild的Java應用執行. 在執行任務之前首先本地化任務需要的資源, 比如作業配置, JAR檔案, 以及分散式快取的所有檔案(第10步). 最後, 執行map或reduce任務(第11步).

  YarnChild執行在一個專用的JVM中, 但是YARN不支援JVM重用. 
5. 進度和狀態更新

  YARN中的任務將其進度和狀態(包括counter)返回給應用管理器, 客戶端每秒(通過mapreduce.client.progressmonitor.pollinterval設定)嚮應用管理器請求進度更新, 展示給使用者。 
6. 作業完成

  除了嚮應用管理器請求作業進度外, 客戶端每5分鐘都會通過呼叫waitForCompletion()來檢查作業是否完成. 時間間隔可以通過mapreduce.client.completion.pollinterval來設定. 作業完成之後, 應用管理器和container會清理工作狀態, OutputCommiter的作業清理方法也會被呼叫. 作業的資訊會被作業歷史伺服器儲存以備之後使用者核查.


相關文章