開源組件系列(9):資源管理與調度系統(YARN)

目錄

(一)概述

(二)YARN基本架構

(三)YARN高可用性

(四)YARN工作流程

(五)YARN資源調度器

(六)YARN的具體調度場景

(七)YARN資源隔離

(八)YARN生態系統

(九)資源管理系統架構演化


(一)概述

 

YARN作爲一個通用的資源管理系統,目標是將短期作業和長期服務混合部署到一個集羣中,併爲它們提供統一的資源管理和調度功能。YARN是大數據系統發展到一定階段的必然產物,其他類似的框架還有Google Borg、Google Omega、Twitter Mesos等。概括起來,資源管理系統需要解決如下兩個問題:

1.提高集羣資源利用率

在大數據時代,爲了存儲和處理海量數據,需要規模較大的集羣服務或者數據中心,運行數量衆多、類型繁雜的應用程序,例如離線作業、流式作業、迭代式作業等。這些服務的資源利用率通常很不均衡,有一些滿負荷運行,有一些則長期閒置。爲了讓各種類型的服務集合成一個大集羣,共享所有的資源,並由一個系統統一調度和分配,這就誕生了類似於YARN的系統。

2.服務自動化部署

一旦將所有計算資源抽象成一個“大型計算機”後,就會產生一個問題:公司的各種服務如何部署?因此,這類四通實際上也是一種服務統一管理系統,提供服務資源申請、服務自動化部署、服務容錯等功能。

 

(二)YARN基本架構

 

YARN總體上採用了Master/Slave架構,其中,ResourceManager爲Master,NodeManager爲Slave,ResourceManager服務對各個NodeManager上的資源進行統一管理和調度。當用戶提交一個應用程序時,需要提供一個用以追蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,並要求NodeManager啓動可以佔用一定資源的任務,由不同的ApplicationMaster被分不到不同的節點上,因此它們之間不會相互影響。詳情如下圖所示:

下面講述各個組件的詳情:

1.ResourceManager(RM):RM是一個全局的資源管理器,負責整個系統的資源管理和分配,主要由兩個組件構成:調度器(Scheduler)和應用管理器(Application Manager)。

調度器(Scheduler):調度器功能主要功能是根據資源容量、隊列等方面的限制條件,將系統中的資源分配給各個應用程序。YARN中的調度器是一個“純調度器”,它不再從事任何與具體應用程序相關的工作,例如監控或者跟蹤應用的執行狀態,這些會交給ApplicationMaster來負責。

應用管理器(Application Manager):負責整個系統中的所有應用程序,包括應用程序的提交、與調度器協商資源以啓動ApplicationMaster、監控ApplicationMaster運營狀態並在失敗時重啓它等。

2.ApplicationMaster(AM):用戶提交的每個應用程序均包含一個獨立的AM,主要功能包括:與RM調度器協商以獲得資源;將得到的資源進一步分配給其內部的任務;與NM通信以啓動/停止任務;監控所有任務的運行狀態,並在任務運行失敗時重新爲任務申請資源以重啓任務。

3.NodeManager(NM):NM是每個節點上的資源管理器,一方面會定時向RM彙報本節點上的資源使用情況和各個Container的運行狀態;另一方面,它接收並處理來自AM的任務啓動/停滯等各種請求。由於YARN內置了容錯機制,單個NM的故障不會對集羣中的應用程序運行產生嚴重影響。

4.Container:Container是YARN中的基本資源分配單位,是對應用程序運行環境的抽象,併爲應用程序提供資源隔離環境。它封裝了多維度的資源,如內存、CPU、磁盤、網絡等,當AM向RM申請資源時,RM爲AM返回的資源便是使用Container表示的。YARN中每個人物均會對應一個Container,且該任務只能使用該Container中描述的資源。

 

(三)YARN高可用性

 

YARN提供了恢復機制,這使得YARN在服務出現故障或者人工重啓時,不會對正在運行的應用程序產生任何影響。包括如下三個方面:

1.ResourceManager HA:ResourceManager負責集羣中資源的調度和應用程序的管理,是YARN最核心的組件。由於YARN採用了Master/Slave架構,這使得ResourceManager有了單點故障的可能性。爲了避免ResourceManager的故障導致整個集羣不可用,YARN映入了Active/Standby ResourceManager,通過Zookeeper的選舉機制,通過冗餘方式解決ResourceManager單點故障。

2.ResourceManager Recovery:ResourceManager內置了重啓恢復功能,當ResourceManager就低重啓,發生Active/Standby切換時,不會影響正在運行的應用程序運行。具體包括如下流程:第一步,保存元信息:包括應用程序的元信息、狀態信息及安全憑證等信息持久化到狀態存儲系統中,存儲系統可以是Zookeeper、FileSystem或者是LevelDB;第二步,加載元信息,一旦Active ResourceManager出現了故障,新啓動的ResourceManager將從相關存儲系統中重新加載相關信息;第三步,重構狀態信息:新的ResourceManager重啓完成後,各個NodeManageer會向它重新註冊,將所管理的Container信息彙報給ResourceManager。同時,ApplicationMaster會向ResourceManager重新發送資源請求,以便ResourceManager重新爲其分配資源。

3.NodeManageer Recovery:NodeManager同樣內置了重啓恢復功能,當NodeManager重啓時,之前正在運行的Container不會被殺掉,而是由新的NodeManager接管,並正常運行。

 

(四)YARN工作流程

 

運行在YARN上的應用程序主要分爲兩類:短作業和長服務。其中,短作業是指一定時間內(分鐘級或小時級)可運行完成的任務,如MapReduce作業、Spark作業等;長服務指不出意外,永不終止運行的應用程序,通常是一些在線服務,如Storm Service、HBase Service等,它們本身作爲一個框架提供訪問接口供用戶使用。

當用戶向YARN提交了一個應用程序後,YARN將分兩個階段運行該應用程序:第一個階段時啓動ApplicationMaster;第二個階段是由ApplicationMaster創建應用程序,爲它們申請資源,並監控整個運行過程,直到運行成功。如下圖所示:

具體工作流程如下:

1.提交應用程序:用戶通過客戶端與YARN ResourceManager通信,以提交應用程序,應用程序中需包含ApplicationMaster可執行代碼、啓動命令、資源需求、應用程序代碼、資源需求的優先級等信息;

2.啓動ApplicationMaster:ResourceManager爲該應用程序分配第一個Container,並與之對應的NodeManager通信,要求它在這個Container中啓動應用程序的ApplicationMaster,之後ApplicationMaster的生命週期被ResourceManager管理;

3. ApplicationMaster註冊:ApplicationMaster啓動後,首先向ResourceManager註冊,這樣用戶可以直接通過ResourceManager查看應用程序的運行狀態,然後,它將初始應用化程序,並按照一定的策略爲內部任務申請資源,監控運行狀態,直到運行結束,即重複步驟4~7;

4.資源獲取:ApplicationMaster採用輪詢的方式,通過RPC協議向ResourceManager申請和領取資源;

5.請求啓動Container:一旦ApplicationMaster申請到資源後,則與對應的NodeManager通信,請求爲其啓動任務;

6.啓動Container:NodeManager爲任務設置好運行環境後,將任務啓動命令寫到一個腳本中,並通過ContaExecutor運行該腳本啓動任務;

7.Container監控:ApplicationMaster可通過兩種方式獲取各個Container的運行狀態,以便在任務失敗時重新啓動任務,包括週期性心跳信息和RPC協議彙報;

8.註銷ApplicationMaster:應用程序完成後,ApplicationMaster向ResourceManager註銷,並退出執行。

 

(五)YARN資源調度器

 

1.Capacity Scheduler

Capacity Scheduler是雅虎開發的多租戶調度器,以隊列爲單位劃分資源,每個隊列可設定一定比例的資源最低保證和使用上限,同時,每個用戶也可以設定一定的資源使用以防止資源濫用。當一個隊列的資源有剩餘時,可暫時將剩餘資源共享給其他隊列。Capacity Scheduler的特點主要有:

(1)容量保證:管理員可以爲每個隊列設置資源最低保證和資源使用上限,而所有提交到該隊列的應用程序共享這些資源;

(2)靈活性:如果一個隊列的資源有剩餘,可以暫時共享給那些需要資源的隊列,而一旦該隊列有新的應用程序提交,則其他隊列釋放資源後會歸還給該隊列;

(3)多重租賃:支持多用戶共享集羣和多應用程序同時運行,以防止單個應用程序、用戶或者隊列獨佔集羣中的資源,管理員可爲之增加多重約束;

(4)安全保證:管理員可通過ACL限制每個隊列的訪問控制列表,普通用戶可爲自己的應用程序指定其他哪些用戶可管理它;

(5)動態更新配置文件:管理員可根據需要動態修改各種資源調度器相關配置參數而無需重啓集羣。

 

2.Fair Scheduler

Fair Scheduler是Facebook開發的多用戶調度器,同樣以隊列爲單位劃分資源,每個隊列可設定一定比例的資源最低保證和使用上限。與Capacity Scheduler的不同點主要體現在如下方面:

(1)資源公平共享:每個隊列中,Fair Scheduler可選擇按照FIFO、Fair或DRF策略爲應用程序分配資源,其中Fair策略是一種基於最大最小公平法實現的資源多路複用方式,默認情況下,每個隊列內部採用該方式分配資源。這意味着,如果一個隊列中有兩個應用程序同時運行,則每個應用程序可得到1/2的資源;如果是三個應用程序,則分配到1/3的資源。

(2)調度策略配置靈活:Fair Scheduler允許管理員爲每個隊列單獨設置調度策略;

(3)提高小應用程序響應時間:由於採用了最大最小公平算法,小作業可以快速獲取資源並運行完成;

(4)應用程序在隊列間轉移:用戶可動態將一個正在運行的應用從一個隊列轉移到另外一個隊列。

以上兩種調度方式的對比如下:

 

3.基於節點標籤的調度

基於節點標籤的調度是一種調度策略,就像基於優先級的調度一樣,是調度器中衆多調度策略中的一種,可以跟其他調度策略混合使用。該策略的基本思想是:用戶可爲每個NodeManager打上標籤,比如high、low等,以作爲NodeManager的基本屬性;同時,用戶可以爲調度器中的隊列設置若干標籤,以限制該隊列只能佔用包含對應標籤的節點資源,這樣,提交到某個隊列中的作業,只能運行在特定的一些節點上。通過打標籤,用戶可以將Hadoop分成若干個子集羣,進而使得用戶可將應用程序運行到符合某種特徵的節點上,比如可將內存密集型的應用程序運行到大內存節點上。

 

(六)YARN的具體調度場景

 

例子:公司最初的Hadoop集羣有20個節點,硬件資源是32G內存,4TB硬盤。隨着Spark框架的流行,公司希望引入Spark技術,因此購買了10個64GB的大內存節點。爲了讓Spark和MapReduce等不同類型的程序運行在一個集羣中,公司規定,Spark程序智能運行在後來的10個大內存節點上,之前的20個節點運行MapReduce任務。

如何在YARN中實現這種調度方式呢?

1.首先,爲20箇舊節點打上normal標籤,爲10個新節點打上highmem標籤;

2.其次,在Capacity Scheduler中,創建兩個隊列,分別是四Hadoop和Spark,其中Hadoop隊列可使用標籤是normal和highmem,而Spark是highmem,並配置兩個隊列的相關屬性;

3.最後,將Spark任務提交到Spark隊列中,而MapReduce任務提交到Hadoop隊列中。

值得注意的是,爲了提高資源利用率,資源調度器會將負載較輕的隊列資源暫時分配給負載較重的隊列,僅當負載較輕的隊列突然收到新提交的應用程序時,調度器纔會進一步將本該屬於該隊列的資源分配給它,但由於此時資源可能正在被其他隊列使用,釋放時間不確定,因此調度器等待一定時間後發現資源未釋放,則進行資源搶佔。

 

(七)YARN資源隔離

 

資源隔離指爲不同任務提供可獨立使用的計算資源,以避免它們相互干擾。YARN對內存資源和CPU資源採用了不同的隔離方案。對於內存資源,它是一種限制性資源,它的量大小直接決定了應用程序的死活,爲了能夠更靈活的控制內存使用,YARN提供了兩種可選方案:線程監控方案和基於輕量級資源隔離技術Cgroups的方案。默認情況下,YARN採用了進程監控的方案控制內存使用,即每個NodeManager會啓動一個額外的線程監控每個Container的內存資源使用量,一旦發現它超過約定的資源量,則會將其殺死。採用這種機制的一個原因是因爲Java中創建子進程採用了“fork()+exec()”的方案,子進程啓動瞬間,它使用的內存量與父進程一直,從外面看來,一個進程的使用內存量可能瞬間翻倍,然後又降下來,採用線程監控的方法可以防止這種情況下導致swap操作。另一種可選方案基於輕量級資源隔離技術Cgroups,Cgroups是Linux內核提供的彈性資源隔離機制,可以嚴格控制內存使用上限,一旦進程使用資源量超過了實現定義的上限值,則可將其殺死。對於CPU資源,它是一種彈性資源,它的大小不直接影響應用程序的死活,因此採用了Cgroups方案。

 

(八)YARN生態系統

 

YARN發展到今天,已經成爲了一個數據操作系統,很多新的計算框架離開了YARN將不再能夠單獨運行,典型的代表是DAG計算框架Tez和Spark。總結起來,支持運行在YARN上的計算框架和服務主要有:

1.MapReduce:經典的離線計算框架;

2.Tez:Hortonworks開源的DAG計算框架,在MapReduce基礎上擴展而來,重用了MapReduce大量代碼,廣泛的應用在Hive、Pig等引擎中;

3.Storm:流式實時計算框架,運行環境由Nimnus和Supervisor等組件組成;

4.Spark:通用的DAG內存計算引擎,適合於數據挖掘、機器學習等方面的應用,相較於MapReduce,更加的高效易用;

5.HBase:構建在HDFS之上的數據庫系統;

6.Giraph:開源圖算法庫;

7.OpenMPI:經典的高性能並行編成接口。

 

(九)資源管理系統架構演化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章