YARN作业提交流程剖析
YARN(MapReduce2)
Yet Another Resource Negotiator / YARN Application Resource Negotiator
對(duì)于節(jié)點(diǎn)數(shù)超出4000的大型集群,MapReduce1系統(tǒng)開始面臨著擴(kuò)展性瓶頸。所以有了YARN的出現(xiàn)。
YARN將jobtracker的職能劃分為多個(gè)獨(dú)立的實(shí)體,從而改善了MR1面臨的擴(kuò)展瓶頸問(wèn)題。Jobtracker負(fù)責(zé)作業(yè)調(diào)度和任務(wù)進(jìn)度監(jiān)視,跟蹤任務(wù)、重啟失敗或過(guò)慢的任務(wù)和進(jìn)行任務(wù)登記,例如維護(hù)計(jì)數(shù)器總數(shù)。
YARN將這兩種角色劃分為兩個(gè)獨(dú)立的守護(hù)進(jìn)程:管理集群上資源使用的資源管理器(Resource Manager)和管理集群上運(yùn)行任務(wù)生命周期的應(yīng)用管理器(Application master)。基本思路是:應(yīng)用服務(wù)器與資源管理器協(xié)商集群的計(jì)算資源:容器(containers,每個(gè)容器都有特定的內(nèi)存上限),在這些容器上運(yùn)行特定應(yīng)用程序的進(jìn)程。容器由集群節(jié)點(diǎn)上運(yùn)行的節(jié)點(diǎn)管理器(NodeManager)監(jiān)視,以確保應(yīng)用程序使用的資源不會(huì)超過(guò)分配給它的資源。
與jobtracker不同,應(yīng)用的每個(gè)實(shí)例(一個(gè)MapReduce任務(wù))有一個(gè)專用的應(yīng)用master,它運(yùn)行在應(yīng)用的運(yùn)行期間。
YARN上的MapReduce比經(jīng)典的MapReduce包括更多的實(shí)體
1. 提交MapReduce作業(yè)的客戶端
2. YARN資源管理器(ResourceManager),負(fù)責(zé)協(xié)調(diào)集群上計(jì)算資源的分配
3. YARN節(jié)點(diǎn)管理器(NodeManager),負(fù)責(zé)啟動(dòng)和監(jiān)視集群中機(jī)器上的計(jì)算容器(container)
4. MapReduce應(yīng)用程序master負(fù)責(zé)協(xié)調(diào)運(yùn)行MapReduce作業(yè)的任務(wù)。它和MapReduce任務(wù)在容器中運(yùn)行,這些容器由資源管理器分配并由節(jié)點(diǎn)管理器進(jìn)行管理
5. 分布式文件系統(tǒng)(一般為HDFS),用來(lái)與其他實(shí)體間共享作業(yè)文件
作業(yè)運(yùn)行過(guò)程如圖
一、作業(yè)的提交
1. MapReduce2中的作業(yè)提交是使用與MapReduce1相同的用戶API
2. 從資源管理器獲取新的作業(yè)ID,在YARN命名法中它是一個(gè)應(yīng)用程序ID
3. 作業(yè)客戶端檢查作業(yè)的輸出說(shuō)明,計(jì)算輸入分片并將作業(yè)資源(包括作業(yè)JAR、配置和分片信息)復(fù)制到HDFS。
4. 通過(guò)調(diào)用資源管理器上的submitApplication方法提交作業(yè)
二、作業(yè)初始化
5. 資源管理器收到調(diào)用它的submitApplication消息后,便將請(qǐng)求傳遞給調(diào)度器(scheduler)。調(diào)度器分配一個(gè)容器,然后資源管理器在節(jié)點(diǎn)管理器的管理下在容器中啟動(dòng)應(yīng)用程序的master進(jìn)程
6. MapReduce作業(yè)的application master是一個(gè)Java應(yīng)用程序,它的主類是MRAppMaster。它對(duì)作業(yè)進(jìn)行初始化:通過(guò)創(chuàng)建多個(gè)簿記對(duì)象以保持對(duì)作業(yè)進(jìn)度的跟蹤,因?yàn)樗鼘⒔邮軄?lái)自任務(wù)的進(jìn)度和完成報(bào)告
7. 接下來(lái)master接受來(lái)自共享文件系統(tǒng)的在客戶端計(jì)算的輸入分片,對(duì)每一個(gè)分片創(chuàng)建一個(gè)map任務(wù)對(duì)象一級(jí)有mapreduce.job.reduces屬性確定的多個(gè)reduce任務(wù)對(duì)象
接下來(lái),application master決定如何運(yùn)行構(gòu)成MapReduce作業(yè)的各個(gè)任務(wù)。如果作業(yè)很小,就選擇在與它同一個(gè)JVM上運(yùn)行任務(wù)
相對(duì)于在一個(gè)節(jié)點(diǎn)上順序運(yùn)行他們,判斷在新的容器中分配和運(yùn)行任務(wù)的開銷大于并行運(yùn)行它們的開銷時(shí),就會(huì)發(fā)生這一情況。這不同于MapReduce1,MapReduce1從不在單個(gè)tasktracker上運(yùn)行小作業(yè)。這樣的作業(yè)稱為uberized,或者作為uber任務(wù)運(yùn)行。
哪些任務(wù)是小任務(wù)?默認(rèn)情況下,小任務(wù)就是小于10個(gè)mapper且只有一個(gè)reducer且輸入大小小于一個(gè)HDFS塊的任務(wù)。(通過(guò)設(shè)置mapreduce.job.ubertask.maxmaps、mapreduce.job.ubertask.maxreduces和mapreduce.job.ubertask.maxbytes可以改變一個(gè)作業(yè)的上述值)。將mapreduce.job.ubertask.enable設(shè)置為false也可以完全使uber任務(wù)不可用。
在任何任務(wù)運(yùn)行之前,作業(yè)的setup方法為了設(shè)置作業(yè)的Outputcommiter被調(diào)用來(lái)建立作業(yè)的輸出目錄。在MapReduce1中,它在一個(gè)由tasktracker運(yùn)行的特殊任務(wù)中被調(diào)用(作業(yè)創(chuàng)建),而在YARN執(zhí)行框架中,該方法由應(yīng)用程序master直接調(diào)用。
三、任務(wù)分配
8. 如果作業(yè)不適合作為uber任務(wù)運(yùn)行,那么application master就會(huì)為該作業(yè)中的左右map任務(wù)和reduce任務(wù)向資源管理器請(qǐng)求容器。心跳信息的請(qǐng)求包括每個(gè)map任務(wù)的數(shù)據(jù)本地化信息,特別是輸入分片所在的主機(jī)和相應(yīng)機(jī)架信息。調(diào)度器使用這些信息來(lái)做調(diào)度決策(像jobtracker的調(diào)度器一樣)。理想情況下,它將任務(wù)分配到數(shù)據(jù)本地化的節(jié)點(diǎn),但如果不可能這樣做,調(diào)度器就會(huì)相對(duì)于非本地化的分配優(yōu)先使用機(jī)架本地化的分配。
請(qǐng)求也為任務(wù)制定了內(nèi)存需求。在默認(rèn)情況下,map任務(wù)和reduce任務(wù)都分配到1024MB的內(nèi)存,但這可以通過(guò)mapreduce.map.memory.mb和mapreduce.reduce.memory.mb來(lái)設(shè)置。
內(nèi)存的分配方式不同于MapReduce1,MapReduce1中tasktrackers有在集群配置時(shí)設(shè)置的固定數(shù)量的槽,每個(gè)任務(wù)在一個(gè)槽上運(yùn)行。槽有最大內(nèi)存分配限制,這對(duì)集群是固定的,導(dǎo)致當(dāng)任務(wù)使用較少內(nèi)存時(shí)無(wú)法充分利用內(nèi)存(因?yàn)槠渌却娜蝿?wù)不能使用這些未使用的內(nèi)存)以及由于任務(wù)不能獲取足夠內(nèi)存而導(dǎo)致作業(yè)失敗。
在YARN中,資源分為更細(xì)的粒度,所以可以避免上述問(wèn)題。應(yīng)用程序可以請(qǐng)求最小到最大限制范圍的任意最小值倍數(shù)的內(nèi)存容量。默認(rèn)的內(nèi)存分配容量是調(diào)度器特定的,對(duì)于容量調(diào)度器,它的默認(rèn)值最小值是1024MB(由yarn.scheduler.capacity.minimum-allocation-mb設(shè)置),默認(rèn)的最大值是10240MB(由yarn.scheduler.capacity.maximum-allocation-mb設(shè)置)。因此,任務(wù)可以通過(guò)適當(dāng)設(shè)置mapreduce.map.memory.mb和mapreduce.reduce.memory.mb來(lái)請(qǐng)求1GB到10GB間的任意1GB倍數(shù)的內(nèi)存容量(調(diào)度器在需要的時(shí)候使用最接近的倍數(shù))
四、任務(wù)執(zhí)行
9. 一旦資源管理器的調(diào)度器(scheduler)為任務(wù)分配了容器,application master就通過(guò)與節(jié)點(diǎn)管理器通信來(lái)啟動(dòng)容器(container)
10. 該任務(wù)由主類為YarnChild的Java應(yīng)用程序執(zhí)行。在它運(yùn)行任務(wù)之前,首先將任務(wù)需要的資源本地化,包括作業(yè)的配置、JAR文件和所有來(lái)自分布式緩存的文件
11. 運(yùn)行map任務(wù)和reduce任務(wù)
五、進(jìn)度和狀態(tài)更新
在YARN下運(yùn)行時(shí),任務(wù)每三秒通過(guò)umbilical接口向application master匯報(bào)進(jìn)度和狀態(tài)(包含計(jì)數(shù)器),作為作業(yè)的匯聚試圖(aggregate view),如下圖。MapReduce1通過(guò)tasktracker到j(luò)obtracker來(lái)實(shí)現(xiàn)進(jìn)度更新。
客戶端每秒鐘(通過(guò)mapreduce.client.progressmonitor.pollinterval設(shè)置)查詢一次application master以接收進(jìn)度更新,通常都會(huì)向用戶顯示。
在MapReduce1中,作業(yè)跟蹤器的Web UI展示運(yùn)行作業(yè)列表及其進(jìn)度。在YARN中,資源管理器的Web UI展示了正在運(yùn)行的應(yīng)用以及連接到的對(duì)應(yīng)application master,每個(gè)application master展示MapReduce作業(yè)的進(jìn)度等進(jìn)一步的細(xì)節(jié)。
六、作業(yè)完成
除了向application master查詢進(jìn)度外,客戶端每5秒鐘還通過(guò)調(diào)用Job的waitForCompletion來(lái)檢查作業(yè)是否完成。查詢的間隔可以通過(guò)mapreduce.client.completion.pollinterval屬性進(jìn)行設(shè)置。
作業(yè)完成后,application master和任務(wù)容器清理其工作狀態(tài),OutputCommiter的作業(yè)清理方法會(huì)被調(diào)用。作業(yè)歷史服務(wù)器保存作業(yè)的信息供用戶需要時(shí)查詢。
總結(jié)
以上是生活随笔為你收集整理的YARN作业提交流程剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pyecharts学习(part5)--
- 下一篇: opencv学习(part1)--Ope