1. YARN產生背景
MapReduce本身存在着一些問題:
1)JobTracker單點故障問題;如果Hadoop集群的JobTracker掛掉,則整個分布式集群都不能使用了。
2)JobTracker承受的訪問壓力大,影響系統的擴展性。
3)不支持MapReduce之外的計算框架,比如Storm、Spark、Flink等。
與舊MapReduce相比,YARN采用了一種分層的集群框架,具有以下幾種優勢。
1)Hadoop2.0提出了HDFSFederation;它讓多個NameNode分管不同的目錄進而實現訪問隔離和橫向擴展。對於運行中NameNode的單點故障,通過 NameNode熱備方案(NameNode HA)實現 。
2) YARN通過將資源管理和應用程序管理兩部分剝離開來,分別由ResourceManager和ApplicationMaster進程來實現。其中,ResouceManager專管資源管理和調度,而ApplicationMaster則負責與具體應用程序相關的任務切分、任務調度和容錯等。
3)YARN具有向后兼容性,用戶在MR1上運行的作業,無需任何修改即可運行在YARN之上。
4)對於資源的表示以內存為單位(在目前版本的 Yarn 中沒有考慮 CPU的占用),比之前以剩余 slot 數目為單位更合理。
5)支持多個框架,YARN不再是一個單純的計算框架,而是一個框架管理器,用戶可以將各種各樣的計算框架移植到YARN之上,由YARN進行統一管理和資源分配,由於將現有框架移植到YARN之上需要一定的工作量,當前YARN僅可運行MapReduce這種離線計算框架。
6)框架升級容易,在YARN中,各種計算框架不再是作為一個服務部署到集群的各個節點上(比如MapReduce框架,不再需要部署JobTracker、 TaskTracker等服務),而是被封裝成一個用戶程序庫(lib)存放在客戶端,當需要對計算框架進行升級時,只需升級用戶程序庫即可,
2. 什么是YARN
YARN是Hadoop2.0版本新引入的資源管理系統,直接從MR1演化而來。
核心思想:將MP1中JobTracker的資源管理和作業調度兩個功能分開,分別由ResourceManager和ApplicationMaster進程來實現。
1)ResourceManager:負責整個集群的資源管理和調度。
2)ApplicationMaster:負責應用程序相關的事務,比如任務調度、任務監控和容錯等。
YARN的出現,使得多個計算框架可以運行在一個集群當中。
1)每個應用程序對應一個ApplicationMaster。
2)目前可以支持多種計算框架運行在YARN上面比如MapReduce、Storm、Spark、Flink等。
3. YARN的基本架構

從YARN的架構圖來看,它主要由ResourceManager和ApplicationMaster、NodeManager、ApplicationMaster和Container等組件組成。
ResourceManager(RM)
YARN分層結構的本質是ResourceManager。這個實體控制整個集群並管理應用程序向基礎計算資源的分配。ResourceManager 將各個資源部分(計算、內存、帶寬等)精心安排給基礎NodeManager(YARN 的每節點代理)。ResourceManager還與 ApplicationMaster 一起分配資源,與NodeManager 一起啟動和監視它們的基礎應用程序。在此上下文中,ApplicationMaster 承擔了以前的 TaskTracker 的一些角色,ResourceManager 承擔了 JobTracker 的角色。
1)處理客戶端請求;
2)啟動或監控ApplicationMaster;
3)監控NodeManager;
4)資源的分配與調度。
NodeManager(NM)
NodeManager管理一個YARN集群中的每個節點。NodeManager提供針對集群中每個節點的服務,從監督對一個容器的終生管理到監視資源和跟蹤節點健康。MRv1通過插槽管理Map和Reduce任務的執行,而NodeManager 管理抽象容器,這些容器代表着可供一個特定應用程序使用的針對每個節點的資源。YARN繼續使用HDFS層。它的主要 NameNode用於元數據服務,而DataNode用於分散在一個集群中的復制存儲服務。
1)單個節點上的資源管理;
2)處理來自ResourceManager上的命令;
3)處理來自ApplicationMaster上的命令。
ApplicationMaster(AM)
ApplicationMaster管理一個在YARN內運行的應用程序的每個實例。ApplicationMaster 負責協調來自 ResourceManager 的資源,並通過 NodeManager 監視容器的執行和資源使用(CPU、內存等的資源分配)。請注意,盡管目前的資源更加傳統(CPU 核心、內存),但未來會帶來基於手頭任務的新資源類型(比如圖形處理單元或專用處理設備)。從 YARN 角度講,ApplicationMaster 是用戶代碼,因此存在潛在的安全問題。YARN 假設 ApplicationMaster 存在錯誤或者甚至是惡意的,因此將它們當作無特權的代碼對待。
1)負責數據的切分;
2)為應用程序申請資源並分配給內部的任務;
3)任務的監控與容錯。
Container
對任務運行環境進行抽象,封裝CPU、內存等多維度的資源以及環境變量、啟動命令等任務運行相關的信息。比如內存、CPU、磁盤、網絡等,當AM向RM申請資源時,RM為AM返回的資源便是用Container表示的。YARN會為每個任務分配一個Container,且該任務只能使用該Container中描述的資源。
要使用一個YARN集群,首先需要來自包含一個應用程序的客戶的請求。ResourceManager 協商一個容器的必要資源,啟動一個ApplicationMaster 來表示已提交的應用程序。通過使用一個資源請求協議,ApplicationMaster協商每個節點上供應用程序使用的資源容器。執行應用程序時,ApplicationMaster 監視容器直到完成。當應用程序完成時,ApplicationMaster 從 ResourceManager 注銷其容器,執行周期就完成了。
4. YARN的原理
YARN 的作業運行,主要由以下幾個步驟組成:

1)作業提交
client調用job.waitForCompletion方法,向整個集群提交MapReduce作業 (第1步) 。 新的作業ID(應用ID)由資源管理器分配(第2步). 作業的client核實作業的輸出, 計算輸入的split,將作業的資源(包括Jar包, 配置文件, split信息)拷貝給HDFS(第3步). 最后, 通過調用資源管理器的submitApplication()來提交作業(第4步).
2)作業初始化
當資源管理器收到submitApplication()的請求時, 就將該請求發給調度器(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的作業清理方法也會被調用。作業的信息會被作業歷史服務器存儲以備之后用戶核查。
5. MapReduce on YARN
1、MapReduce on TARN
1)YARN負責資源管理和調度;
2)ApplicationMaster負責任務管理。
2、MapReduce ApplicationMaster
1)MRAppMaster;
2)每個MapReduce啟動一個MRAppMaster;
3)MRAppMaster負責任務切分、任務調度、任務監控和容錯。
3、MRAppMaster任務調度
1)YARN將資源分配給MRAppMaster;
2)MRAppMaster進一步將資源分配給內部任務。
4、MRAppMaster容錯
1)MRAppMaster運行失敗后,由YARN重新啟動;
2)任務運行失敗后,由YARN重新申請資源。
6. YARN HA(高可用)

ResourceManager由一對分別處於Active和Standby狀態的ResourceManager組成,它使用基於Zookeeper的選舉算法來決定ResourceManager的狀態。其中,ZKFC僅為ResourceManager的一個進程服務,不是單獨存在的(區別於HDFS,它是獨立存在的進程),負責監控ResourceManager的健康狀況並定期向Zookeeper發送心跳。ResourceManager通過RMStateStore(目前有基於內存的、基於文件系統的和基於Zookeeper的等,此處使用后者)來存儲內部數據、主要應用數據和標記等。
以上就是博主為大家介紹的這一板塊的主要內容,這都是博主自己的學習過程,希望能給大家帶來一定的指導作用,有用的還望大家點個支持,如果對你沒用也望包涵,有錯誤煩請指出。如有期待可關注博主以第一時間獲取更新哦,謝謝!
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
