轉:yarn詳解

背景

Yarn是一個分佈式的資源管理系統,用以提升分佈式的集羣環境下的資源利用率,這些資源包括內存、IO、網絡、磁盤等。其產生的緣由是爲了解決原MapReduce框架的不足。最初MapReducecommitter們還能夠週期性的在已有的代碼上進行修改,但是隨着代碼的增長以及原MapReduce框架設計的不足,在原MapReduce框架上進行修改變得愈來愈困難,因此MapReducecommitter們決定從架構上從新設計MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具備更好的擴展性、可用性、可靠性、向後兼容性和更高的資源利用率以及能支持除了MapReduce計算框架外的更多的計算框架。html

MapReduce框架的不足

l  JobTracker是集羣事務的集中處理點,存在單點故障node

l  JobTracker須要完成的任務太多,既要維護job的狀態又要維護jobtask的狀態,形成過多的資源消耗apache

l  taskTracker端,用map/reduce task做爲資源的表示過於簡單,沒有考慮到cpu、內存等資源狀況,當把兩個須要消耗大內存的task調度到一塊兒,很容易出現OOM網絡

l  把資源強制劃分爲map/reduce slot,當只有map task時,reduce slot不能用;當只有reduce task時,map slot不能用,容易形成資源利用不足。架構

 

Yarn架構

                                         yarn詳解

Yarn/MRv2最基本的想法是將原JobTracker主要的資源管理和job調度/監視功能分開做爲兩個單獨的守護進程。有一個全局的ResourceManager(RM)和每一個Application有一個ApplicationMaster(AM)Application至關於map-reduce job或者DAG jobsResourceManagerNodeManager(NM)組成了基本的數據計算框架。ResourceManager協調集羣的資源利用,任何client或者運行着的applicatitonMaster想要運行job或者task都得向RM申請必定的資源。ApplicatonMaster是一個框架特殊的庫,對於MapReduce框架而言有它本身的AM實現,用戶也能夠實現本身的AM,在運行的時候,AM會與NM一塊兒來啓動和監視tasksapp

 

ResourceManager

ResourceManager做爲資源的協調者有兩個主要的組件:SchedulerApplicationsManager(AsM)框架

Scheduler負責分配最少但知足application運行所需的資源量給ApplicationScheduler只是基於資源的使用狀況進行調度,並不負責監視/跟蹤application的狀態,固然也不會處理失敗的taskRM使用resource container概念來管理集羣的資源,resource container是資源的抽象,每一個container包括必定的內存、IO、網絡等資源,不過目前的實現只包括內存一種資源。分佈式

ApplicationsManager負責處理client提交的job以及協商第一個container以供applicationMaster運行,而且在applicationMaster失敗的時候會從新啓動applicationMaster。下面闡述RM具體完成的一些功能。oop

 

一、  資源調度url

Scheduler從全部運行着的application收到資源請求後構建一個全局的資源分配計劃,而後根據application特殊的限制以及全局的一些限制條件分配資源。

二、  資源監視

Scheduler會週期性的接收來自NM的資源使用率的監控信息,另外applicationMaster能夠從Scheduler獲得屬於它的已完成的container的狀態信息。

三、  application提交

l  clientAsM得到一個applicationID

l  clientapplication定義以及須要的jar包文件等上傳到hdfs的指定目錄,由yarn-site.xmlyarn.app.mapreduce.am.staging-dir指定

l  client構造資源請求的對象以及application的提交上下文發送給AsM

l  AsM接收application的提交上下文

l  AsM根據application的信息向Scheduler協商一個ContainerapplicationMaster運行,而後啓動applicationMaster

l  向該container所屬的NM發送launchContainer信息啓動該container,也即啓動applicationMaster

l  AsMclient提供運行着的AM的狀態信息。

四、  AM的生命週期

AsM負責系統中全部AM的生命週期的管理。AsM負責AM的啓動,當AM啓動後,AM會週期性的向AsM發送heartbeat,默認是1sAsM據此瞭解AM的存活狀況,而且在AM失敗時負責重啓AM,如果必定時間事後(默認10分鐘)沒有收到AMheartbeatAsM就認爲該AM失敗了。

 

關於ResourceManager的可用性目前尚未很好的實現,不過Cloudera公司的CDH4.4之後的版本實現了一個簡單的高可用性,使用了Hadoop-common項目中HA部分的代碼,採用了相似hdfs namenode高可用性的設計,給RM引入了activestandby狀態,不過沒有與journalnode相對應的角色,只是由zookeeper來負責維護RM的狀態,這樣的設計只是一個最簡單的方案,避免了手動重啓RM,離真正的生產可用還有一段距離。

NodeManager

NM主要負責啓動RM分配給AMcontainer以及表明AMcontainer,而且會監視container的運行狀況。在啓動container的時候,NM會設置一些必要的環境變量以及將container運行所需的jar包、文件等從hdfs下載到本地,也就是所謂的資源本地化;當全部準備工做作好後,纔會啓動表明該container的腳本將程序啓動起來。啓動起來後,NM會週期性的監視該container運行佔用的資源狀況,如果超過了該container所聲明的資源量,則會kill掉該container所表明的進程。

另外,NM還提供了一個簡單的服務以管理它所在機器的本地目錄。Applications能夠繼續訪問本地目錄即便那臺機器上已經沒有了屬於它的container在運行。例如,Map-Reduce應用程序使用這個服務存儲map output而且shuffle它們給相應的reduce task

NM上還能夠擴展本身的服務,yarn提供了一個yarn.nodemanager.aux-services的配置項,經過該配置,用戶能夠自定義一些服務,例如Map-Reduceshuffle功能就是採用這種方式實現的。

NM在本地爲每一個運行着的application生成以下的目錄結構:

yarn詳解

 

Container目錄下的目錄結構以下:

yarn詳解

 

在啓動一個container的時候,NM就執行該containerdefault_container_executor.sh,該腳本內部會執行launch_container.shlaunch_container.sh會先設置一些環境變量,最後啓動執行程序的命令。對於MapReduce而言,啓動AM就執行org.apache.hadoop.mapreduce.v2.app.MRAppMaster;啓動map/reduce task就執行org.apache.hadoop.mapred.YarnChild

ApplicationMaster

   ApplicationMaster是一個框架特殊的庫,對於Map-Reduce計算模型而言有它本身的applicationMaster實現,對於其餘的想要運行在yarn上的計算模型而言,必須得實現針對該計算模型的applicaitonMaster用以向RM申請資源運行task,好比運行在yarn上的spark框架也有對應的applicationMaster實現,歸根結底,yarn是一個資源管理的框架,並非一個計算框架,要想在yarn上運行應用程序,還得有特定的計算框架的實現。因爲yarn是伴隨着MRv2一塊兒出現的,因此下面簡要概述MRv2yarn上的運行流程。

 

MRv2運行流程:

一、  MR JobClientresourceManager(AsM)提交一個job

二、  AsMScheduler請求一個供MR AM運行的container,而後啓動它

三、  MR AM啓動起來後向AsM註冊

四、  MR JobClientAsM獲取到MR AM相關的信息,而後直接與MR AM進行通訊

五、  MR AM計算splits併爲全部的map構造資源請求

六、  MR AM作一些必要的MR OutputCommitter的準備工做

七、  MR AMRM(Scheduler)發起資源請求,獲得一組供map/reduce task運行的container,而後與NM一塊兒對每個container執行一些必要的任務,包括資源本地化等

八、  MR AM 監視運行着的task 直到完成,當task失敗時,申請新的container運行失敗的task

九、  當每一個map/reduce task完成後,MR AM運行MR OutputCommittercleanup 代碼,也就是進行一些收尾工做

10、當全部的map/reduce完成後,MR AM運行OutputCommitter的必要的job commit或者abort APIs

11MR AM退出。

 

 

Yarn上寫應用程序     

    yarn上寫應用程序並不一樣於咱們熟知的MapReduce應用程序,必須牢記yarn只是一個資源管理的框架,並非一個計算框架,計算框架能夠運行在yarn上。咱們所能作的就是向RM申請container,而後配合NM一塊兒來啓動container。就像MRv2同樣,jobclient請求用於MR AM運行的container,設置環境變量和啓動命令,而後交由NM去啓動MR AM,隨後map/reduce task就由MR AM全權負責,固然task的啓動也是由MR AMRM申請container,而後配合NM一塊兒來啓動的。因此要想在yarn上運行非特定計算框架的程序,咱們就得實現本身的clientapplicationMaster。另外咱們自定義的AM須要放在各個NMclasspath下,由於AM可能運行在任何NM所在的機器上。

 

原文來自於:http://blog.sina.com.cn/s/blog_829a682d0101lc9d.html