背景
Yarn是一個分布式的資源管理系統(tǒng),用以提高分布式的集群環(huán)境下的資源利用率,這些資源包括內(nèi)存、IO、網(wǎng)絡(luò)、磁盤等。其產(chǎn)生的原因是為了解決原MapReduce框架的不足。最初MapReduce的committer們還可以周期性的在已有的代碼上進(jìn)行修改,可是隨著代碼的增加以及原MapReduce框架設(shè)計的不足,在原MapReduce框架上進(jìn)行修改變得越來越困難,所以MapReduce的committer們決定從架構(gòu)上重新設(shè)計MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具有更好的擴(kuò)展性、可用性、可靠性、向后兼容性和更高的資源利用率以及能支持除了MapReduce計算框架外的更多的計算框架。
原MapReduce框架的不足
圖1 原MapReduce框架的不足
、貸obTracker是集群事務(wù)的集中處理點,存在單點故障
②JobTracker需要完成的任務(wù)太多,既要維護(hù)job的狀態(tài)又要維護(hù)job的task的狀態(tài),造成過多的資源消耗
、墼趖askTracker端,用map/reduce task作為資源的表示過于簡單,沒有考慮到CPU、內(nèi)存等資源情況,當(dāng)把兩個需要消耗大內(nèi)存的task調(diào)度到一起,很容易出現(xiàn)OOM
、馨奄Y源強制劃分為map/reduce slot,當(dāng)只有map task時,reduce slot不能用;當(dāng)只有reduce task時,map slot不能用,容易造成資源利用不足。
Yarn架構(gòu)
Yarn/MRv2最基本的想法是將原JobTracker主要的資源管理和job調(diào)度/監(jiān)視功能分開作為兩個單獨的守護(hù)進(jìn)程。有一個全局的ResourceManager(RM)和每個Application有一個ApplicationMaster(AM),Application相當(dāng)于map-reduce job或者DAG jobs。
ResourceManager和NodeManager(NM)組成了基本的數(shù)據(jù)計算框架。ResourceManager協(xié)調(diào)集群的資源利用,任何client或者運行著的applicatitonMaster想要運行job或者task都得向RM申請一定的資源。ApplicatonMaster是一個框架特殊的庫,對于MapReduce框架而言有它自己的AM實現(xiàn),用戶也可以實現(xiàn)自己的AM,在運行的時候,AM會與NM一起來啟動和監(jiān)視tasks。
ResourceManager
ResourceManager作為資源的協(xié)調(diào)者有兩個主要的組件:Scheduler和ApplicationsManager(AsM)。
Scheduler負(fù)責(zé)分配最少但滿足application運行所需的資源量給Application。
Scheduler只是基于資源的使用情況進(jìn)行調(diào)度,并不負(fù)責(zé)監(jiān)視/跟蹤application的狀態(tài),當(dāng)然也不會處理失敗的task。RM使用resource container概念來管理集群的資源,resource container是資源的抽象,每個container包括一定的內(nèi)存、IO、網(wǎng)絡(luò)等資源,不過目前的實現(xiàn)只包括內(nèi)存一種資源。
ApplicationsManager處理client提交的job以及協(xié)商第一個container以供applicationMaster運行,并且在applicationMaster失敗的時候會重新啟動applicationMaster。下面闡述RM具體完成的一些功能。
1.資源調(diào)度:Scheduler從所有運行著的application收到資源請求后構(gòu)建一個全局的資源分配計劃,然后根據(jù)application特殊的限制以及全局的一些限制條件分配資源。
2.資源監(jiān)視:Scheduler周期性的接收來自NM的資源使用率的監(jiān)控信息,另外applicationMaster可以從Scheduler得到屬于它的已完成的container的狀態(tài)信息。
3.Application提交:
①client向AsM獲得一個applicationIDclient將application定義以及需要的jar包
②client將application定義以及需要的jar包文件等上傳到hdfs的指定目錄,由yarn-site.xml的yarn.app.mapreduce.am.staging-dir指定
③client構(gòu)造資源請求的對象以及application的提交上下文發(fā)送給AsM
④AsM接收application的提交上下文
⑤AsM根據(jù)application的信息向Scheduler協(xié)商一個Container供applicationMaster運行,然后啟動applicationMaster
⑥向該container所屬的NM發(fā)送launchContainer信息啟動該container,也即啟動applicationMaster、AsM向client提供運行著的AM的狀態(tài)信息。
4.AM的生命周期:AsM負(fù)責(zé)系統(tǒng)中所有AM的生命周期的管理。AsM負(fù)責(zé)AM的啟動,當(dāng)AM啟動后,AM會周期性的向AsM發(fā)送heartbeat,默認(rèn)是1s,AsM據(jù)此了解AM的存活情況,并且在AM失敗時負(fù)責(zé)重啟AM,若是一定時間過后(默認(rèn)10分鐘)沒有收到AM的heartbeat,AsM就認(rèn)為該AM失敗了。
關(guān)于ResourceManager的可用性目前還沒有很好的實現(xiàn),不過Cloudera公司的CDH4.4以后的版本實現(xiàn)了一個簡單的高可用性,使用了Hadoop-common項目中HA部分的代碼,采用了類似hdfs namenode高可用性的設(shè)計,給RM引入了active和standby狀態(tài),不過沒有與journalnode相對應(yīng)的角色,只是由zookeeper來負(fù)責(zé)維護(hù)RM的狀態(tài),這樣的設(shè)計只是一個最簡單的方案,避免了手動重啟RM,離真正的生產(chǎn)可用還有一段距離。
NodeManager
NM主要負(fù)責(zé)啟動RM分配給AM的container以及代表AM的container,并且會監(jiān)視container的運行情況。在啟動container的時候,NM會設(shè)置一些必要的環(huán)境變量以及將container運行所需的jar包、文件等從hdfs下載到本地,也就是所謂的資源本地化;當(dāng)所有準(zhǔn)備工作做好后,才會啟動代表該container的腳本將程序啟動起來。啟動起來后,NM會周期性的監(jiān)視該container運行占用的資源情況,若是超過了該container所聲明的資源量,則會kill掉該container所代表的進(jìn)程。
另外,NM還提供了一個簡單的服務(wù)以管理它所在機器的本地目錄。Applications可以繼續(xù)訪問本地目錄即使那臺機器上已經(jīng)沒有了屬于它的container在運行。例如,Map-Reduce應(yīng)用程序使用這個服務(wù)存儲map output并且shuffle它們給相應(yīng)的reduce task。
在NM上還可以擴(kuò)展自己的服務(wù),yarn提供了一個yarn.nodemanager.aux-services的配置項,通過該配置,用戶可以自定義一些服務(wù),例如Map-Reduce的shuffle功能就是采用這種方式實現(xiàn)的。
NM在本地為每個運行著的application生成如下的目錄結(jié)構(gòu):
圖2 NM生成的目錄結(jié)構(gòu)
Container目錄下的目錄結(jié)構(gòu)如下:
圖3 Container目錄下的目錄結(jié)構(gòu)
在啟動一個container的時候,NM就執(zhí)行該container的default_container_executor.sh,該腳本內(nèi)部會執(zhí)行l(wèi)aunch_container.sh。launch_container.sh會先設(shè)置一些環(huán)境變量,最后啟動執(zhí)行程序的命令。對于MapReduce而言,啟動AM就執(zhí)行org.apache.hadoop.mapreduce.v2.app.MRAppMaster;啟動map/reduce task就執(zhí)行org.apache.hadoop.mapred.YarnChild。
ApplicationMaster
ApplicationMaster是一個框架特殊的庫,對于Map-Reduce計算模型而言有它自己的ApplicationMaster實現(xiàn),對于其他的想要運行在yarn上的計算模型而言,必須得實現(xiàn)針對該計算模型的ApplicationMaster用以向RM申請資源運行task,比如運行在yarn上的spark框架也有對應(yīng)的ApplicationMaster實現(xiàn),歸根結(jié)底,yarn是一個資源管理的框架,并不是一個計算框架,要想在yarn上運行應(yīng)用程序,還得有特定的計算框架的實現(xiàn)。由于yarn是伴隨著MRv2一起出現(xiàn)的,所以下面簡要概述MRv2在yarn上的運行流程。
MRv2運行流程:
①MR JobClient向resourceManager(AsM)提交一個job
②AsM向Scheduler請求一個供MR AM運行的container,然后啟動它
③MR AM啟動起來后向AsM注冊
④MR JobClient向AsM獲取到MR AM相關(guān)的信息,然后直接與MR AM進(jìn)行通信
⑤MR AM計算splits并為所有的map構(gòu)造資源請求
⑥MR AM做一些必要的MR OutputCommitter的準(zhǔn)備工作
⑦M(jìn)R AM向RM(Scheduler)發(fā)起資源請求,得到一組供map/reduce task運行的container,然后與NM一起對每一個container執(zhí)行一些必要的任務(wù),包括資源本地化等
⑧MR AM 監(jiān)視運行著的task 直到完成,當(dāng)task失敗時,申請新的container運行失敗的task
⑨當(dāng)每個map/reduce task完成后,MR AM運行MR OutputCommitter的cLEANup 代碼,也就是進(jìn)行一些收尾工作
⑩當(dāng)所有的map/reduce完成后,MR AM運行OutputCommitter的必要的job commit或者abort APIs
在Yarn上寫應(yīng)用程序
在yarn上寫應(yīng)用程序并不同于我們熟知的MapReduce應(yīng)用程序,必須牢記yarn只是一個資源管理的框架,并不是一個計算框架,計算框架可以運行在yarn上。我們所能做的就是向RM申請container,然后配合NM一起來啟動container。就像MRv2一樣,jobclient請求用于MR AM運行的container,設(shè)置環(huán)境變量和啟動命令,然后交由NM去啟動MR AM,隨后map/reduce task就由MR AM全權(quán)負(fù)責(zé),當(dāng)然task的啟動也是由MR AM向RM申請container,然后配合NM一起來啟動的。所以要想在yarn上運行非特定計算框架的程序,我們就得實現(xiàn)自己的client和applicationMaster。另外我們自定義的AM需要放在各個NM的classpath下,因為AM可能運行在任何NM所在的機器上。
核心關(guān)注:拓步ERP系統(tǒng)平臺是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.oesoe.com/
本文標(biāo)題:Hadoop新一代MapReduce框架的改進(jìn)及優(yōu)勢
本文網(wǎng)址:http://www.oesoe.com/html/support/11121512533.html