編者按:對(duì)于業(yè)界的大數(shù)據(jù)存儲(chǔ)及分布式處理系統(tǒng)來說,Hadoop 是耳熟能詳?shù)淖吭介_源分布式文件存儲(chǔ)及處理框架,對(duì)于 Hadoop 框架的介紹在此不再累述,隨著需求的發(fā)展,Yarn
框架浮出水面,
@依然光榮復(fù)興的
博客給我們做了很詳細(xì)的介紹,讀者通過本文中新舊 Hadoop MapReduce 框架的對(duì)比,更能深刻理解新的 yarn 框架的技術(shù)原理和設(shè)計(jì)思想。
Yarn是一個(gè)分布式的資源管理系統(tǒng),用以提高分布式的集群環(huán)境下的資源利用率,這些資源包括內(nèi)存、IO、網(wǎng)絡(luò)、磁盤等。其產(chǎn)生的原因是為了解決原MapReduce框架的不足。最初MapReduce的committer們還可以周期性的在已有的代碼上進(jìn)行修改,可是隨著代碼的增加以及原MapReduce框架設(shè)計(jì)的不足,在原MapReduce框架上進(jìn)行修改變得越來越困難,所以MapReduce的committer們決定從架構(gòu)上重新設(shè)計(jì)MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具有更好的擴(kuò)展性、可用性、可靠性、向后兼容性和更高的資源利用率以及能支持除了MapReduce計(jì)算框架外的更多的計(jì)算框架。
Yarn/MRv2最基本的想法是將原JobTracker主要的資源管理和job調(diào)度/監(jiān)視功能分開作為兩個(gè)單獨(dú)的守護(hù)進(jìn)程。有一個(gè)全局的ResourceManager(RM)和每個(gè)Application有一個(gè)ApplicationMaster(AM),Application相當(dāng)于map-reduce
job或者DAG jobs。ResourceManager和NodeManager(NM)組成了基本的數(shù)據(jù)計(jì)算框架。ResourceManager協(xié)調(diào)集群的資源利用,任何client或者運(yùn)行著的applicatitonMaster想要運(yùn)行job或者task都得向RM申請(qǐng)一定的資源。ApplicatonMaster是一個(gè)框架特殊的庫,對(duì)于MapReduce框架而言有它自己的AM實(shí)現(xiàn),用戶也可以實(shí)現(xiàn)自己的AM,在運(yùn)行的時(shí)候,AM會(huì)與NM一起來啟動(dòng)和監(jiān)視tasks。
ResourceManager作為資源的協(xié)調(diào)者有兩個(gè)主要的組件:Scheduler和ApplicationsManager(AsM)。
Scheduler負(fù)責(zé)分配最少但滿足application運(yùn)行所需的資源量給Application。Scheduler只是基于資源的使用情況進(jìn)行調(diào)度,并不負(fù)責(zé)監(jiān)視/跟蹤application的狀態(tài),當(dāng)然也不會(huì)處理失敗的task。RM使用resource container概念來管理集群的資源,resource container是資源的抽象,每個(gè)container包括一定的內(nèi)存、IO、網(wǎng)絡(luò)等資源,不過目前的實(shí)現(xiàn)只包括內(nèi)存一種資源。
ApplicationsManager負(fù)責(zé)處理client提交的job以及協(xié)商第一個(gè)container以供applicationMaster運(yùn)行,并且在applicationMaster失敗的時(shí)候會(huì)重新啟動(dòng)applicationMaster。下面闡述RM具體完成的一些功能。
關(guān)于ResourceManager的可用性目前還沒有很好的實(shí)現(xiàn),不過Cloudera公司的CDH4.4以后的版本實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的高可用性,使用了Hadoop-common項(xiàng)目中HA部分的代碼,采用了類似hdfs namenode高可用性的設(shè)計(jì),給RM引入了active和standby狀態(tài),不過沒有與journalnode相對(duì)應(yīng)的角色,只是由zookeeper來負(fù)責(zé)維護(hù)RM的狀態(tài),這樣的設(shè)計(jì)只是一個(gè)最簡(jiǎn)單的方案,避免了手動(dòng)重啟RM,離真正的生產(chǎn)可用還有一段距離。
NM主要負(fù)責(zé)啟動(dòng)RM分配給AM的container以及代表AM的container,并且會(huì)監(jiān)視container的運(yùn)行情況。在啟動(dòng)container的時(shí)候,NM會(huì)設(shè)置一些必要的環(huán)境變量以及將container運(yùn)行所需的jar包、文件等從hdfs下載到本地,也就是所謂的資源本地化;當(dāng)所有準(zhǔn)備工作做好后,才會(huì)啟動(dòng)代表該container的腳本將程序啟動(dòng)起來。啟動(dòng)起來后,NM會(huì)周期性的監(jiān)視該container運(yùn)行占用的資源情況,若是超過了該container所聲明的資源量,則會(huì)kill掉該container所代表的進(jìn)程。
另外,NM還提供了一個(gè)簡(jiǎn)單的服務(wù)以管理它所在機(jī)器的本地目錄。Applications可以繼續(xù)訪問本地目錄即使那臺(tái)機(jī)器上已經(jīng)沒有了屬于它的container在運(yùn)行。例如,Map-Reduce應(yīng)用程序使用這個(gè)服務(wù)存儲(chǔ)map output并且shuffle它們給相應(yīng)的reduce task。
在NM上還可以擴(kuò)展自己的服務(wù),yarn提供了一個(gè)yarn.nodemanager.aux-services的配置項(xiàng),通過該配置,用戶可以自定義一些服務(wù),例如Map-Reduce的shuffle功能就是采用這種方式實(shí)現(xiàn)的。
NM在本地為每個(gè)運(yùn)行著的application生成如下的目錄結(jié)構(gòu):
在啟動(dòng)一個(gè)container的時(shí)候,NM就執(zhí)行該container的default_container_executor.sh,該腳本內(nèi)部會(huì)執(zhí)行l(wèi)aunch_container.sh。launch_container.sh會(huì)先設(shè)置一些環(huán)境變量,最后啟動(dòng)執(zhí)行程序的命令。對(duì)于MapReduce而言,啟動(dòng)AM就執(zhí)行org.apache.hadoop.mapreduce.v2.app.MRAppMaster;啟動(dòng)map/reduce
task就執(zhí)行org.apache.hadoop.mapred.YarnChild。
ApplicationMaster是一個(gè)框架特殊的庫,對(duì)于Map-Reduce計(jì)算模型而言有它自己的ApplicationMaster實(shí)現(xiàn),對(duì)于其他的想要運(yùn)行在yarn上的計(jì)算模型而言,必須得實(shí)現(xiàn)針對(duì)該計(jì)算模型的ApplicationMaster用以向RM申請(qǐng)資源運(yùn)行task,比如運(yùn)行在yarn上的spark框架也有對(duì)應(yīng)的ApplicationMaster實(shí)現(xiàn),歸根結(jié)底,yarn是一個(gè)資源管理的框架,并不是一個(gè)計(jì)算框架,要想在yarn上運(yùn)行應(yīng)用程序,還得有特定的計(jì)算框架的實(shí)現(xiàn)。由于yarn是伴隨著MRv2一起出現(xiàn)的,所以下面簡(jiǎn)要概述MRv2在yarn上的運(yùn)行流程。
MRv2運(yùn)行流程:
在yarn上寫應(yīng)用程序并不同于我們熟知的MapReduce應(yīng)用程序,必須牢記yarn只是一個(gè)資源管理的框架,并不是一個(gè)計(jì)算框架,計(jì)算框架可以運(yùn)行在yarn上。我們所能做的就是向RM申請(qǐng)container,然后配合NM一起來啟動(dòng)container。就像MRv2一樣,jobclient請(qǐng)求用于MR AM運(yùn)行的container,設(shè)置環(huán)境變量和啟動(dòng)命令,然后交由NM去啟動(dòng)MR AM,隨后map/reduce task就由MR AM全權(quán)負(fù)責(zé),當(dāng)然task的啟動(dòng)也是由MR AM向RM申請(qǐng)container,然后配合NM一起來啟動(dòng)的。所以要想在yarn上運(yùn)行非特定計(jì)算框架的程序,我們就得實(shí)現(xiàn)自己的client和applicationMaster。另外我們自定義的AM需要放在各個(gè)NM的classpath下,因?yàn)锳M可能運(yùn)行在任何NM所在的機(jī)器上。
原文鏈接:Yarn詳解(責(zé)編:Arron)