Hadoop 之分布式資源管理框架YARN

1, YARN?概述

YARN?是“ Yet Another Resource Negotiator”的簡稱。在進一步了解?YARN?框架之前我們需要知道,相比較而言,?MapReduce?則是?YARN?的一個特例。?YARN?則是?MapReduce?的一個更加通用和高級的框架形式,并在其上增加了更多的功能。例如通過加載分布式執(zhí)行腳本可以在集群節(jié)點上執(zhí)行獨立的腳本任務,并且更多功能正在被追加中。所以我們可以看到,YARN?可以直接運行在?MapReduce?運行的框架上而不會造成更多的干擾,并且會為集群的運算帶來更多的好處。更一步的開發(fā)顯示了?YARN?會允許開發(fā)者根據(jù)自己的需求運行不同版本的?MapReduce?在集群中,這將為開發(fā)者提供更為便捷的服務。

普遍認為,云計算包括以下幾個層次的服務: IaaS、PaaS和SaaS。這里所謂的層次,是分層體系架構意義上的“層次”。laas. Paas、 Saas分別實現(xiàn)在基礎設施層、軟件開放運行平臺層、應用軟件層。

IaaS(Infrastructure-as-a-Service):基礎設施即服務。消費者通過Internet可以從完善的計算機基礎設施獲得服務。laas 通過網絡向用戶提供計算機(物理機和虛擬機)、存儲空間、網絡連接、負載均衡和防火墻等基本計算資源;用戶在此基礎上部署和運行各種軟件,包括操作系統(tǒng)和應用程序等。

PaaS(Platform-as-a-Service):平臺即服務。PaaS 是將軟件研發(fā)的平臺作為一種服務,以SaaS的模式提交給用戶。平臺通常包括操作系統(tǒng)、編程語言的運行環(huán)境、數(shù)據(jù)庫和Web服務器等,用戶可以在平臺上部署和運行自己的應用。通常而言,用戶不能管理和控制底層的基礎設施,只能控制自已部署的應用。

SaaS(Software-as-a-Service):軟件即服務。它是一種通過Internet提供軟件的模式,用戶無需購買軟件,而是向提供商租用基于Web的軟件,來管理企業(yè)經營活動。云提供商在云端安裝和運行應用軟件,云用戶通過云客戶端(比如Web瀏覽器)使用軟件。

? ? 從云計算分層概念上講,YARN可看做PAAS層,它能夠為不同類型的應用程序提供統(tǒng)一的管理和調度。

2, YARN架構

關于上圖架構 ,主要包括以下幾種角色

ResourceManager(RM):主要接收客戶端任務請求,接收和監(jiān)控NodeManager(NM)的資源情況匯報,負責資源的分配與調度,啟動和監(jiān)控ApplicationMaster(AM)。

NodeManager:主要是節(jié)點上的資源管理,啟動Container運行task計算,上報資源、container情況給RM和任務處理情況給AM。

ApplicationMaster:主要是單個Application(Job)的task管理和調度,向RM進行資源的申請,向NM發(fā)出launch Container指令,接收NM的task處理狀態(tài)信息。

ResourceManager是Yarn的核心, 負責調度Application master, 來給每個NodeManager分配資源, 資源儲存在Container中, 此處的資源包括JVM,內存等, 然后將程序copy到container中運行, container還需要回報狀態(tài)給App master, 再有app master匯報給Resource manager, nodeManager也要按時匯報ResourceManager當前節(jié)點的資源使用情況.

下面簡單介紹以下提交一個job的處理過程

1、client submit一個job到RM,進入RM中的Scheduler隊列供調度(Scheduler負責申請資源)

2、RM根據(jù)NM匯報的資源情況(NM會定時匯報資源和container使用情況),請求一個合適的NM launch container,以啟動運行AM

3、AM啟動后,注冊到RM上,以使client可以查到AM的信息,便于client直接和AM通信

4、AM啟動后,根據(jù)Job 相關的split的task情況,會和RM協(xié)商申請container資源

5、RM分配給AM container資源后,根據(jù)container的信息,向對應的NM 請求launch container

6、NM啟動container運行task,運行過程中向AM匯報進度狀態(tài)信息,類似于MRv1中 task的匯報;同時NM也會定時的向RM匯報container的使用情況。

7、在application(job)執(zhí)行過程中,client可以和AM通信,獲取application相關的進度和狀態(tài)信息。

8、在application(job)完成后,AM通知RM clear自己的相關信息,并關閉,釋放自己占用的container。

3, YARN調度管理

yarn分為一級調度管理和二級調度管理

一級調度管理(更近底層,更接近于操作資源, 更偏向于應用層和底層結合)

計算資源管理(cpu,內存等,計算復雜消耗的cpu多)

App生命周期管理

二級調度管理(自己代碼的算法等, 更偏向于應用層)

App內部的計算模型管理

多樣化的計算模型

4, YARN 服務組件

ResourceManager

????全局的資源管理器,整個集群只有一個,負責集群資源的統(tǒng)一管理和調度分配。

????功能: 處理客戶端請求

? ????? 啟動/監(jiān)控ApplicationMaster

???????監(jiān)控NodeManager

? ????? 資源分配與調度

Application Master

????管理一個在YARN 內運行的應用程序的每個實例

功能

數(shù)據(jù)切分

為應用程序申請資源,并進一步分配給內部任務

????????任務監(jiān)控與容錯

負責協(xié)調來自ResourceManager的資源,幵通過NodeManager監(jiān)視容器的執(zhí)行和資源使用(CPU、內存等的資源分配)。

NodeManager

????整個集群有多個,負責單節(jié)點資源管理和使用

功能

單個節(jié)點上的資源管理和任務管理

處理來自ResourceManager的命令

????????處理來自ApplicationMaster的命令

NodeManager管理抽象容器,這些容器代表著可供一個特定應用程序使用的針對每個節(jié)點的資源。

定時地向RM匯報本節(jié)點上的資源使用情況和各個Container的運行狀態(tài)。

Container

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

功能

對任務運行環(huán)境的抽象

描述一系列信息

任務運行資源(節(jié)點、內存、CPU)

任務啟動命令

任務運行環(huán)境

其他組件還包括

JobHistoryServer

作業(yè)歷史服務,記錄歷史情況 , 通過mr-jobhistory-daemon.sh start historyserver 來啟動, 啟動成功會出現(xiàn)JobHistoryServer進程 , 并且可以從19888端口進行查看日志詳細信息

TimelineServer

用來寫日志服務數(shù)據(jù) , 一般來寫與第三方結合的日志服務數(shù)據(jù)(比如spark等)

5, YARN 優(yōu)勢

更快地MapReduce計算

? YARN利用異步模型對MapReduce框架的一些關鍵邏輯結構(如JobInprogress、TaskInProgress等)進行了重寫,相比于MRv1,具有更快地計算速度。

對多框架支持

? YARN不再是一個單純的計算框架,而是一個框架管理器,用戶可以將各種各樣的計算框架移植到YARN之上。

框架升級更容易

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

6, YARN通信協(xié)議

RPC協(xié)議是連接各個組件的“大動脈”,了解不同組件之間的RPC協(xié)議有助于我們更深人地學習YARN框架。在YARN中,任何兩個需相互通信的組件之間僅有一個RPC協(xié)議,面對于任何一個RPC協(xié)議,通信雙方有一端是Client, 另一端為Server, 且Client總是主動連接 Server的,因此,YARN實際上采用的是拉式(ull-based) 通信模型。如下圖所示,箭頭指向的組件是RPC Server, 而箭頭尾部的組件是RPC Client, YARN主要由以下幾個RPC協(xié)議組成:

(1)JobClient(作業(yè)提交客戶端)與RM之間的協(xié)議---ApplicationClientProtocol :

JobClient通過該RPC協(xié)議提交應用程序、查詢應用程序狀態(tài)等。

(2)Admin(管理員)與RM之間的通信協(xié)議----ResourceManagerAdministrationProtocol:

Admin通過該RPC協(xié)議更新系統(tǒng)配置文件,比如節(jié)點黑白名單、用戶隊列權限等。

(3)AM與RM之間的協(xié)議一ApplicationMasterProtocol: AM通過該RPC協(xié)議向RM注冊和撒銷自己,并為各個任務申請資源。

(4)AM與NM之間的協(xié)議一-ContainerManagementProtocol: AM通過該RPC要求NM啟動或者停止Container,獲取各個Container的使用狀態(tài)等信息。

(5)NM與RM之間的協(xié)議一-ResuceTracker: NM通過該RPC協(xié)議向RM注冊,并定時發(fā)送心跳信息匯報當前節(jié)點的資源使用情況和Container運行情況。

7, YARN資源管理

???????資源調度和資源隔離是YARN作為一個資源管理系統(tǒng),最重要和最基礎的兩個功能。資源調度由ResourceManager完成,而資源隔離由各個NM實現(xiàn)。

???????ResourceManager將某個NodeManager上資源分配給任務(這就是所謂的“資源調度”)后,NodeManager需按照要求為任務提供相應的資源,甚至保證這些資源應具有獨占性,為任務運行提供基礎的保證,這就是所謂的資源隔離。

???????當談及到資源時,我們通常指內存,CPU和IO三種資源。Hadoop ?YARN同時支持內存和CPU兩種資源的調度。

????? ?內存資源的多少會會決定任務的生死,如果內存不夠,任務可能會運行失敗;相比之下,CPU資源則不同,它只會決定任務運行的快慢,不會對生死產生影響。

YARN允許用戶配置每個節(jié)點上可用的物理內存資源,注意,這里是“可用的”,因為一個節(jié)點上的內存會被若干個服務共享,比如一部分給YARN,一部分給HDFS,一部分給HBase等,YARN配置的只是自己可以使用的,配置參數(shù)如下:

? (1) yarn.nodemanager.resource.memory-mb

? 表示該節(jié)點上YARN可使用的物理內存總重,默認是8192(MB),注意,如果你的節(jié)點內存資源不夠8CB,則懦要調減這個值,而YARN不會智能的探測節(jié)點的物理內存總里。

? (2) yarn.nodemanager.vmem-pmem-ratio

? 任務每使用1MB物理內存,最多可使用虛擬內存里,默認是2.1.

? (3) yarn.nodemanager.pmem-check-enabled

? 是否啟動一個線程檢查每個任務正使用的物理內存里,如果任務超出分配值,則直接將其殺掉,默認是true

? (4) yarn.nodemanager.vmem-check-enabled

? 是否啟動一個線程檢查每個任務正使用的虛擬內存里,如果任務超出分配值,則直接將其殺掉,默認是true

? (5) yarn.scheduler.minimum-allocation-mb

? 單個任務可申請的最少物理內存里,默認是1024(MB),如果一個任務申請的物理內存重少于該值,則該對應的值改這個數(shù)。

? (6) yarn.scheduler.maximum-allocation-mb

?單個任務可申請的最多物理內存里,默認是8192(MB)。

默認情況下,YARN采用了線程監(jiān)控的方法判斷任務是否超量使用內存,一旦發(fā)現(xiàn)超量,則直接將其殺死。由于Cgroups對內存的控制缺乏靈活性(即任務任何時刻不能超過內存上限,如果超過,則直接將其殺死或者報OOM),而Java進程在創(chuàng)建瞬間內存將翻倍,之后驟降到正常值,這種情況下,采用線程監(jiān)控的方式更加靈活(當發(fā)現(xiàn)進程樹內存瞬間翻倍超過設定值時,可認為是正常現(xiàn)象,不會將任務殺死),因此YARN未提供Cgroups內存隔離機制。

目前的CPU被劃分成虛擬CPU(CPU virtual Core),這里的虛擬CPU是YARN自己引入的概念,初衷是,考慮到不同節(jié)點的CPU性能可能不同,每個CPU具有的計算能力也是不一樣的,比如某個物理CPU的計算能力可能是另外一個物理CPU的2倍,這時候,你可以通過為第一個物理CPU多配置幾個虛擬CPU彌補這種差異。用戶提交作業(yè)時,可以指定每個任務需要的虛擬CPU個數(shù)。在YARN中,CPU相關配置參數(shù)如下:

? (1) yarn.nodemanager.resource.cpu-vcores

? ????表示該節(jié)點上YARN可使用的虛擬CPU個數(shù), 默認是8.注意.目前推薦將該值設為與物理CPU核數(shù)數(shù)目相同,如果你的節(jié)點CPU核數(shù)不8個,則懦要調小這個值,而YARN不會智能的探測點物理CPU總數(shù).

? (2) yarn.scheduler.minimum-allocation-vcores

? ? ? ?單個任務可申請的最小虛擬cpu個數(shù)默認是1, 如果一個任務申請的CPU個數(shù)少于該數(shù).則該對應的值改為這個數(shù).

? (3) yarn.scheduler.maximum-allocation-vcores

? ? ? ?單個任務可申請的最多虛擬CPU個數(shù),默認是32。

8? 、AM與RM的詳細交互

用戶向YARN ResourceManager提交應用程序,RM收到提交申請后,先向資源調度器申請用以啟動AM 的資源,待申請到資源后,再由ApplicationMasterLauncher與對應的NodeManager通信,從而啟動應用程序的ApplicationMaster。

ApplicationMaster啟動完成后,ApplicationMasterLaucher會通過事件的形式,將剛剛啟動的Application Master注冊到AMLiveMonitor,以啟動心跳監(jiān)控。

ApplicationMaster啟動后,先向ApplicatinMaterService注冊,并將自己所在host、端口號等信息匯報給它。

AM運行過程中,周期性地向ApplicationMaserService回報心跳信息(信息中包含想要申請的資源描述)。

ApplicationMasterService每次收到ApplicationMaster心跳信息好后,將通知AMLivelinessMonitor更新應用程序的最新回報心跳的時間。

應用程序運行完成后,AM向AMService發(fā)送請求,注銷自己。

AMService收到注銷請求后,標注應用程序運行狀態(tài)完成,同時通知AMLivelinessMonitor移除對它的心跳監(jiān)控。

想學習大數(shù)據(jù)或者對大數(shù)據(jù)技術感興趣的朋友,這里我整理了一套大數(shù)據(jù)的學習視頻免費分享給大家,從入門到實戰(zhàn)都有,大家可以加我的微信:Lxiao_28獲取!(備注領取資料)。也歡迎進微信群交流,或者獲取Java高級技術學習資料。

? ?長按識別關注我們,發(fā)現(xiàn)更多精彩內容分享哦? ~ ~

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容