一、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:負責應用程序相關事務,好比任務調度、任務監控和容錯等架構
二、爲何要使用 YARN?框架
與舊 MapReduce 相比,YARN 採用了一種分層的集羣框架,它解決了舊MapReduce 一系列的缺陷,具備如下幾種優點。機器學習
1. 提出了HDFS Federation,它讓多個NameNode分管不一樣的目錄進而實現訪問隔離和橫向擴展。對於運行中NameNode的單點故障,經過 NameNode熱備方案(NameNode HA)實現分佈式
2. YARN經過將資源管理和應用程序管理兩部分分剝離開,分別由ResouceManager和ApplicationMaster負責,其中,ResouceManager專管資源管理和調度,而ApplicationMaster則負責與具體應用程序相關的任務切分、任務調度和容錯等,每一個應用程序對應一個ApplicationMasteroop
3. YARN具備向後兼容性,用戶在MRv1上運行的做業,無需任何修改便可運行在YARN之上。
4. 對於資源的表示之內存爲單位 (在目前版本的Yarn中,沒有考慮 cpu 的佔用 ),比以前以剩餘 slot 數目更合理。
5. 支持多個框架, YARN再也不是一個單純的計算框架,而是一個框架管理器,用戶能夠將各類各樣的計算框架移植到YARN之上,由YARN進行統一管理和資源分配。目前能夠支持多種計算框架運行在YARN上面,好比MapReduce、Storm、Spark、Flink等
6. 框架升級更容易, 在YARN中,各類計算框架再也不是做爲一個服務部署到集羣的各個節點上(好比MapReduce框架,再也不須要部署JobTracler、 TaskTracker等服務),而是被封裝成一個用戶程序庫(lib)存放在客戶端,當須要對計算框架進行升級時,只需升級用戶程序庫便可,多麼容易!
三、YARN 架構由什麼組成?
首先咱們來看看 YARN 的架構圖,以下圖所示。
從 YARN 的架構圖來看,它主要由ResourceManager、NodeManager、ApplicationMaster和Container等如下幾個組件構成。
一、 ResourceManager(RM)
YARN 分層結構的本質是 ResourceManager。這個實體控制整個集羣並管理應用程序向基礎計算資源的分配。ResourceManager 將各個資源部分(計算、內存、帶寬等)精心安排給基礎 NodeManager(YARN 的每節點代理)。ResourceManager 還與 ApplicationMaster 一塊兒分配資源,與 NodeManager 一塊兒啓動和監視它們的基礎應用程序。在此上下文中,ApplicationMaster 承擔了之前的 TaskTracker 的一些角色,ResourceManager 承擔了 JobTracker 的角色。
總的來講,RM有如下做用
1)處理客戶端請求
2)啓動或監控ApplicationMaster
3)監控NodeManager
4)資源的分配與調度
二、 ApplicationMaster(AM)
ApplicationMaster 管理在YARN內運行的每一個應用程序實例。ApplicationMaster 負責協調來自 ResourceManager 的資源,並經過 NodeManager 監視容器的執行和資源使用(CPU、內存等的資源分配)。請注意,儘管目前的資源更加傳統(CPU 核心、內存),但將來會帶來基於手頭任務的新資源類型(好比圖形處理單元或專用處理設備)。從 YARN 角度講,ApplicationMaster 是用戶代碼,所以存在潛在的安全問題。YARN 假設 ApplicationMaster 存在錯誤或者甚至是惡意的,所以將它們看成無特權的代碼對待。
總的來講,AM有如下做用
1)負責數據的切分
2)爲應用程序申請資源並分配給內部的任務
3)任務的監控與容錯
三、 NodeManager(NM)
NodeManager管理YARN集羣中的每一個節點。NodeManager 提供針對集羣中每一個節點的服務,從監督對一個容器的終生管理到監視資源和跟蹤節點健康。MRv1 經過插槽管理 Map 和 Reduce 任務的執行,而 NodeManager 管理抽象容器,這些容器表明着可供一個特定應用程序使用的針對每一個節點的資源。
總的來講,NM有如下做用
1)管理單個節點上的資源
2)處理來自ResourceManager的命令
3)處理來自ApplicationMaster的命令
四、 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) 等標準通訊模式,同時執行各類不一樣的編程模型,包括圖形處理、迭代式處理、機器學習和通常集羣計算。
四、YARN的原理
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的做業清理方法也會被調用. 做業的信息會被做業歷史服務器存儲以備以後用戶覈查.
若是,您認爲閱讀這篇博客讓您有些收穫,不妨點擊一下右下角的【推薦】。
若是,您但願更容易地發現個人新博客,不妨點擊一下左下角的【關注我】。
若是,您對個人博客所講述的內容有興趣,請繼續關注個人後續博客,我是【劉超★ljc】。
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。