Yarn是一個分佈式的資源管理系統,用以提升分佈式的集羣環境下的資源利用率,這些資源包括內存、IO、網絡、磁盤等。其產生的緣由是爲了解決原MapReduce框架的不足。最初MapReduce的committer們還能夠週期性的在已有的代碼上進行修改,但是隨着代碼的增長以及原MapReduce框架設計的不足,在原MapReduce框架上進行修改變得愈來愈困難,因此MapReduce的committer們決定從架構上從新設計MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具備更好的擴展性、可用性、可靠性、向後兼容性和更高的資源利用率以及能支持除了MapReduce計算框架外的更多的計算框架。html
l JobTracker是集羣事務的集中處理點,存在單點故障node
l JobTracker須要完成的任務太多,既要維護job的狀態又要維護job的task的狀態,形成過多的資源消耗apache
l 在taskTracker端,用map/reduce task做爲資源的表示過於簡單,沒有考慮到cpu、內存等資源狀況,當把兩個須要消耗大內存的task調度到一塊兒,很容易出現OOM網絡
l 把資源強制劃分爲map/reduce slot,當只有map task時,reduce slot不能用;當只有reduce task時,map slot不能用,容易形成資源利用不足。架構
Yarn/MRv2最基本的想法是將原JobTracker主要的資源管理和job調度/監視功能分開做爲兩個單獨的守護進程。有一個全局的ResourceManager(RM)和每一個Application有一個ApplicationMaster(AM),Application至關於map-reduce job或者DAG jobs。ResourceManager和NodeManager(NM)組成了基本的數據計算框架。ResourceManager協調集羣的資源利用,任何client或者運行着的applicatitonMaster想要運行job或者task都得向RM申請必定的資源。ApplicatonMaster是一個框架特殊的庫,對於MapReduce框架而言有它本身的AM實現,用戶也能夠實現本身的AM,在運行的時候,AM會與NM一塊兒來啓動和監視tasks。app
ResourceManager做爲資源的協調者有兩個主要的組件:Scheduler和ApplicationsManager(AsM)。框架
Scheduler負責分配最少但知足application運行所需的資源量給Application。Scheduler只是基於資源的使用狀況進行調度,並不負責監視/跟蹤application的狀態,固然也不會處理失敗的task。RM使用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 client向AsM得到一個applicationID
l client將application定義以及須要的jar包文件等上傳到hdfs的指定目錄,由yarn-site.xml的yarn.app.mapreduce.am.staging-dir指定
l client構造資源請求的對象以及application的提交上下文發送給AsM
l AsM接收application的提交上下文
l AsM根據application的信息向Scheduler協商一個Container供applicationMaster運行,而後啓動applicationMaster
l 向該container所屬的NM發送launchContainer信息啓動該container,也即啓動applicationMaster
l AsM向client提供運行着的AM的狀態信息。
四、 AM的生命週期
AsM負責系統中全部AM的生命週期的管理。AsM負責AM的啓動,當AM啓動後,AM會週期性的向AsM發送heartbeat,默認是1s,AsM據此瞭解AM的存活狀況,而且在AM失敗時負責重啓AM,如果必定時間事後(默認10分鐘)沒有收到AM的heartbeat,AsM就認爲該AM失敗了。
關於ResourceManager的可用性目前尚未很好的實現,不過Cloudera公司的CDH4.4之後的版本實現了一個簡單的高可用性,使用了Hadoop-common項目中HA部分的代碼,採用了相似hdfs namenode高可用性的設計,給RM引入了active和standby狀態,不過沒有與journalnode相對應的角色,只是由zookeeper來負責維護RM的狀態,這樣的設計只是一個最簡單的方案,避免了手動重啓RM,離真正的生產可用還有一段距離。
NM主要負責啓動RM分配給AM的container以及表明AM的container,而且會監視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-Reduce的shuffle功能就是採用這種方式實現的。
NM在本地爲每一個運行着的application生成以下的目錄結構:
Container目錄下的目錄結構以下:
在啓動一個container的時候,NM就執行該container的default_container_executor.sh,該腳本內部會執行launch_container.sh。launch_container.sh會先設置一些環境變量,最後啓動執行程序的命令。對於MapReduce而言,啓動AM就執行org.apache.hadoop.mapreduce.v2.app.MRAppMaster;啓動map/reduce task就執行org.apache.hadoop.mapred.YarnChild。
ApplicationMaster是一個框架特殊的庫,對於Map-Reduce計算模型而言有它本身的applicationMaster實現,對於其餘的想要運行在yarn上的計算模型而言,必須得實現針對該計算模型的applicaitonMaster用以向RM申請資源運行task,好比運行在yarn上的spark框架也有對應的applicationMaster實現,歸根結底,yarn是一個資源管理的框架,並非一個計算框架,要想在yarn上運行應用程序,還得有特定的計算框架的實現。因爲yarn是伴隨着MRv2一塊兒出現的,因此下面簡要概述MRv2在yarn上的運行流程。
MRv2運行流程:
一、 MR JobClient向resourceManager(AsM)提交一個job
二、 AsM向Scheduler請求一個供MR AM運行的container,而後啓動它
三、 MR AM啓動起來後向AsM註冊
四、 MR JobClient向AsM獲取到MR AM相關的信息,而後直接與MR AM進行通訊
五、 MR AM計算splits併爲全部的map構造資源請求
六、 MR AM作一些必要的MR OutputCommitter的準備工做
七、 MR AM向RM(Scheduler)發起資源請求,獲得一組供map/reduce task運行的container,而後與NM一塊兒對每個container執行一些必要的任務,包括資源本地化等
八、 MR AM 監視運行着的task 直到完成,當task失敗時,申請新的container運行失敗的task
九、 當每一個map/reduce task完成後,MR AM運行MR OutputCommitter的cleanup 代碼,也就是進行一些收尾工做
10、當全部的map/reduce完成後,MR AM運行OutputCommitter的必要的job commit或者abort APIs
11、MR AM退出。
在yarn上寫應用程序並不一樣於咱們熟知的MapReduce應用程序,必須牢記yarn只是一個資源管理的框架,並非一個計算框架,計算框架能夠運行在yarn上。咱們所能作的就是向RM申請container,而後配合NM一塊兒來啓動container。就像MRv2同樣,jobclient請求用於MR AM運行的container,設置環境變量和啓動命令,而後交由NM去啓動MR AM,隨後map/reduce task就由MR AM全權負責,固然task的啓動也是由MR AM向RM申請container,而後配合NM一塊兒來啓動的。因此要想在yarn上運行非特定計算框架的程序,咱們就得實現本身的client和applicationMaster。另外咱們自定義的AM須要放在各個NM的classpath下,由於AM可能運行在任何NM所在的機器上。
原文來自於:http://blog.sina.com.cn/s/blog_829a682d0101lc9d.html