初步掌握Yarn的架構及原理


轉自:http://www.cnblogs.com/codeOfLife/p/5492740.html

 

1、YARN 是什么?

  從業界使用分布式系統的變化趨勢和 hadoop 框架的長遠發展來看,MapReduce的 JobTracker/TaskTracker 機制需要大規模的調整來修復它在可擴展性,內存消耗,線程模型,可靠性和性能上的缺陷。在過去的幾年中,hadoop 開發團隊做了一些 bug 的修復,但是這些修復的成本越來越高,這表明對原框架做出改變的難度越來越大。為從根本上解決舊MapReduce框架的性能瓶頸,促進 Hadoop 框架的更長遠發展,從 0.23.0 版本開始,Hadoop 的 MapReduce 框架完全重構,發生了根本的變化。新的 Hadoop MapReduce 框架命名為 MapReduceV2 或者叫 Yarn。

  YARN是從0.23.0版本開始新引入的資源管理系統,直接從MR1(0.20.x、0.21.x、0.22.x)演化而來,其核心思想:

將MR1中JobTracker的資源管理和作業調用兩個功能分開,分別由ResourceManager和ApplicationMaster進程來實現

  1)ResourceManager:負責整個集群的資源管理和調度

  2)ApplicationMaster:負責應用程序相關事務,比如任務調度、任務監控和容錯等

2、為什么要使用 YARN?

  與舊 MapReduce 相比,YARN 采用了一種分層的集群框架,它解決了舊MapReduce 一系列的缺陷,具有以下幾種優勢。

  1. 提出了HDFS Federation,它讓多個NameNode分管不同的目錄進而實現訪問隔離和橫向擴展。對於運行中NameNode的單點故障,通過 NameNode熱備方案(NameNode HA)實現

  2. YARN通過將資源管理和應用程序管理兩部分分剝離開,分別由ResouceManager和ApplicationMaster負責,其中,ResouceManager專管資源管理和調度,而ApplicationMaster則負責與具體應用程序相關的任務切分、任務調度和容錯等,每個應用程序對應一個ApplicationMaster

  3. YARN具有向后兼容性,用戶在MRv1上運行的作業,無需任何修改即可運行在YARN之上。

  4. 對於資源的表示以內存為單位 (在目前版本的Yarn中,沒有考慮 cpu 的占用 ),比之前以剩余 slot 數目更合理。

  5. 支持多個框架, YARN不再是一個單純的計算框架,而是一個框架管理器,用戶可以將各種各樣的計算框架移植到YARN之上,由YARN進行統一管理和資源分配。目前可以支持多種計算框架運行在YARN上面,比如MapReduce、Storm、Spark、Flink等

  6. 框架升級更容易, 在YARN中,各種計算框架不再是作為一個服務部署到集群的各個節點上(比如MapReduce框架,不再需要部署JobTracler、 TaskTracker等服務),而是被封裝成一個用戶程序庫(lib)存放在客戶端,當需要對計算框架進行升級時,只需升級用戶程序庫即可,多么容易!

3、YARN 架構由什么組成?

  首先我們來看看 YARN 的架構圖,如下圖所示。

  clip_image002

  從 YARN 的架構圖來看,它主要由ResourceManager、NodeManager、ApplicationMaster和Container等以下幾個組件構成。

  1、 ResourceManager(RM)

    YARN 分層結構的本質是 ResourceManager。這個實體控制整個集群並管理應用程序向基礎計算資源的分配。ResourceManager 將各個資源部分(計算、內存、帶寬等)精心安排給基礎 NodeManager(YARN 的每節點代理)。ResourceManager 還與 ApplicationMaster 一起分配資源,與 NodeManager 一起啟動和監視它們的基礎應用程序。在此上下文中,ApplicationMaster 承擔了以前的 TaskTracker 的一些角色,ResourceManager 承擔了 JobTracker 的角色。

    總的來說,RM有以下作用

    1)處理客戶端請求

    2)啟動或監控ApplicationMaster

    3)監控NodeManager

    4)資源的分配與調度

  2、 ApplicationMaster(AM)

    ApplicationMaster 管理在YARN內運行的每個應用程序實例。ApplicationMaster 負責協調來自 ResourceManager 的資源,並通過 NodeManager 監視容器的執行和資源使用(CPU、內存等的資源分配)。請注意,盡管目前的資源更加傳統(CPU 核心、內存),但未來會帶來基於手頭任務的新資源類型(比如圖形處理單元或專用處理設備)。從 YARN 角度講,ApplicationMaster 是用戶代碼,因此存在潛在的安全問題。YARN 假設 ApplicationMaster 存在錯誤或者甚至是惡意的,因此將它們當作無特權的代碼對待。

    總的來說,AM有以下作用

    1)負責數據的切分

    2)為應用程序申請資源並分配給內部的任務

    3)任務的監控與容錯

  3、 NodeManager(NM)

    NodeManager管理YARN集群中的每個節點。NodeManager 提供針對集群中每個節點的服務,從監督對一個容器的終生管理到監視資源和跟蹤節點健康。MRv1 通過插槽管理 Map 和 Reduce 任務的執行,而 NodeManager 管理抽象容器,這些容器代表着可供一個特定應用程序使用的針對每個節點的資源。

    總的來說,NM有以下作用

    1)管理單個節點上的資源

    2)處理來自ResourceManager的命令

    3)處理來自ApplicationMaster的命令

  4、 Container

    Container 是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等,當AM向RM申請資源時,RM為AM返回的資源便是用Container表示的。YARN會為每個任務分配一個Container,且該任務只能使用該Container中描述的資源。

    總的來說,Container有以下作用

    1)對任務運行環境進行抽象,封裝CPU、內存等多維度的資源以及環境變量、啟動命令等任務運行相關的信息

 

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

 

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

4、YARN的原理

  clip_image004

  YARN 的作業運行,主要由以下幾個步驟組成

  1. 作業提交

    client 調用job.waitForCompletion方法,向整個集群提交MapReduce作業 (第1步) 。 新的作業ID(應用ID)由資源管理器分配(第2步). 作業的client核實作業的輸出, 計算輸入的split, 將作業的資源(包括Jar包, 配置文件, split信息)拷貝給HDFS(第3步). 最后, 通過調用資源管理器的submitApplication()來提交作業(第4步).

  2. 作業初始化

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

    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(第9步). 任務由一個主類為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的作業清理方法也會被調用. 作業的信息會被作業歷史服務器存儲以備之后用戶核查.

  clip_image006


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM