面試 | 深入理解Yarn的內(nèi)部架構(gòu)
本文轉(zhuǎn)載自微信公眾號「大數(shù)據(jù)技術(shù)與數(shù)倉」,作者西貝。轉(zhuǎn)載本文請聯(lián)系大數(shù)據(jù)技術(shù)與數(shù)倉公眾號。
引言
Apache YARN(Yet Another Resource Negotiator)是 Hadoop 的集群資源管理器。Yarn 是在 Hadoop 2.x 中引入的。
Yarn 允許不同的數(shù)據(jù)處理引擎,如圖形處理、交互處理、流處理以及批處理來運(yùn)行和處理存儲在 HDFS(Hadoop 分布式文件系統(tǒng))中的數(shù)據(jù)。其實(shí),YARN不僅負(fù)責(zé)資源分配,而且也會(huì)負(fù)責(zé)作業(yè)的調(diào)度。
MapReduce1.0既是一個(gè)計(jì)算框架,也是一個(gè)資源管理調(diào)度框架。到了Hadoop2.0以后,MapReduce1.0中的資源管理調(diào)度功能,被單獨(dú)分離出來形成了YARN,它是一個(gè)純粹的資源管理調(diào)度框架,而不是一個(gè)計(jì)算框架。被剝離了資源管理調(diào)度功能的MapReduce 框架就變成了MapReduce2.0,它是運(yùn)行在YARN之上的一個(gè)純粹的計(jì)算框架,不再自己負(fù)責(zé)資源調(diào)度管理服務(wù),而是由YARN為其提供資源管理調(diào)度服務(wù)。
如下圖所示:目前主流的大數(shù)據(jù)計(jì)算框架都可以運(yùn)行在YARN上。
YARN的體系結(jié)構(gòu)
YARN總體上仍然是Master/Slave結(jié)構(gòu)。在整個(gè)資源管理框架中,ResourceManager為Master,NodeManager為Slave,ResourceManager負(fù)責(zé)對各個(gè)NodeManager上的資源進(jìn)行統(tǒng)一管理和調(diào)度。當(dāng)用戶提交一個(gè)應(yīng)用程序時(shí),需要提供一個(gè)用以跟蹤和管理這個(gè)程序的ApplicationMaster,它負(fù)責(zé)向ResourceManager申請資源,并要求NodeManger啟動(dòng)可以占用一定資源的任務(wù)。由于不同的ApplicationMaster被分布到不同的節(jié)點(diǎn)上,因此它們之間不會(huì)相互影響。
- ResourceManager
一個(gè)純粹的調(diào)度器,專門負(fù)責(zé)集群中可用資源的分配和管理。
- 調(diào)度器Scheduler
- 應(yīng)用程序管理器(Applications Manager)
- NodeManager
負(fù)責(zé)節(jié)點(diǎn)本地資源的管理,包括啟動(dòng)應(yīng)用程序的Container,監(jiān)控它們的資源使用情況,并報(bào)告給RM
- ApplicationMaster
特定框架庫的一個(gè)實(shí)例,負(fù)責(zé)有RM協(xié)商資源,并和NM協(xié)調(diào)工作來執(zhí)行和監(jiān)控Container以及它們的資源消耗。AM也是以一個(gè)的Container身份運(yùn)行。
ResourceManager
ResourceManager(RM)是一個(gè)全局的資源管理器,負(fù)責(zé)整個(gè)系統(tǒng)的資源管理和分配,主要包括兩個(gè)組件,即調(diào)度器(Scheduler)和應(yīng)用程序管理器(Applications Manager)。
調(diào)度器接收來自ApplicationMaster的應(yīng)用程序資源請求,把集群中的資源以“容器”的形式分配給提出申請的應(yīng)用程序,容器的選擇通常會(huì)考慮應(yīng)用程序所要處理的數(shù)據(jù)的位置,進(jìn)行就近選擇,從而實(shí)現(xiàn)“計(jì)算向數(shù)據(jù)靠攏”。
容器(Container)作為動(dòng)態(tài)資源分配單位,每個(gè)容器中都封裝了一定數(shù)量的CPU、內(nèi)存、磁盤等資源,從而限定每個(gè)應(yīng)用程序可以使用的資源量。
調(diào)度器被設(shè)計(jì)成是一個(gè)可插拔的組件,YARN不僅自身提供了許多種直接可用的調(diào)度器,也允許用戶根據(jù)自己的需求重新設(shè)計(jì)調(diào)度器。
應(yīng)用程序管理器(Applications Manager)負(fù)責(zé)系統(tǒng)中所有應(yīng)用程序的管理工作,主要包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動(dòng)ApplicationMaster、監(jiān)控ApplicationMaster運(yùn)行狀態(tài)并在失敗時(shí)重新啟動(dòng)等。
NodeManager
NodeManager是駐留在一個(gè)YARN集群中的每個(gè)節(jié)點(diǎn)上的代理,主要負(fù)責(zé):
- 容器生命周期管理
- 監(jiān)控每個(gè)容器的資源(CPU、內(nèi)存等)使用情況
- 跟蹤節(jié)點(diǎn)健康狀況
- 以“心跳”的方式與ResourceManager保持通信
- 向ResourceManager匯報(bào)作業(yè)的資源使用情況和每個(gè)容器的運(yùn)行狀態(tài)
- 接收來自ApplicationMaster的啟動(dòng)/停止容器的各種請求
需要說明的是,NodeManager主要負(fù)責(zé)管理抽象的容器,只處理與容器相關(guān)的事情,而不具體負(fù)責(zé)每個(gè)任務(wù)(Map任務(wù)或Reduce任務(wù))自身狀態(tài)的管理,因?yàn)檫@些管理工作是由ApplicationMaster完成的,ApplicationMaster會(huì)通過不斷與NodeManager通信來掌握各個(gè)任務(wù)的執(zhí)行狀態(tài)。
ApplicationMaster
ResourceManager接收用戶提交的作業(yè),按照作業(yè)的上下文信息以及從NodeManager收集來的容器狀態(tài)信息,啟動(dòng)調(diào)度過程,為用戶作業(yè)啟動(dòng)一個(gè)ApplicationMaster。
ApplicationMaster的主要功能是:
- 當(dāng)用戶作業(yè)提交時(shí),ApplicationMaster與ResourceManager協(xié)商獲取資源,ResourceManager會(huì)以容器的形式為ApplicationMaster分配資源;
- 把獲得的資源進(jìn)一步分配給內(nèi)部的各個(gè)任務(wù)(Map任務(wù)或Reduce任務(wù)),實(shí)現(xiàn)資源的“二次分配”;
- 與NodeManager保持交互通信進(jìn)行應(yīng)用程序的啟動(dòng)、運(yùn)行、監(jiān)控和停止,監(jiān)控申請到的資源的使用情況,對所有任務(wù)的執(zhí)行進(jìn)度和狀態(tài)進(jìn)行監(jiān)控,并在任務(wù)發(fā)生失敗時(shí)執(zhí)行失敗恢復(fù)(即重新申請資源重啟任務(wù));
- 定時(shí)向ResourceManager發(fā)送“心跳”消息,報(bào)告資源的使用情況和應(yīng)用的進(jìn)度信息;
- 當(dāng)作業(yè)完成時(shí),ApplicationMaster向ResourceManager注銷容器,執(zhí)行周期完成。
YARN的工作流程
簡單流程示意圖如下:
1.作業(yè)提交
JobSubmitter 實(shí)現(xiàn)的作業(yè)提交過程執(zhí)行以下操作:
- 向資源管理器詢問新的應(yīng)用程序 ID,用于 MapReduce 作業(yè) ID(步驟 2)。
- 檢查作業(yè)的輸出規(guī)范。例如,如果沒有指定輸出目錄或已經(jīng)存在,則不提交作業(yè),并向 MapReduce 程序拋出錯(cuò)誤。
- 計(jì)算作業(yè)的輸入分片。如果無法計(jì)算分片(例如,因?yàn)檩斎肼窂讲淮嬖?,則不會(huì)提交作業(yè),并向 MapReduce 程序拋出錯(cuò)誤。
- 將運(yùn)行作業(yè)所需的資源(包括作業(yè) JAR 文件、配置文件和計(jì)算的輸入分片)復(fù)制到以作業(yè) ID 命名的目錄中的HDFS共享文件系統(tǒng)(步驟 3)。作業(yè) JAR 會(huì)被復(fù)制多個(gè)副本,以便節(jié)點(diǎn)管理器(node managers)在為作業(yè)運(yùn)行任務(wù)時(shí)可以訪問集群中的大量副本。
- 通過在資源管理器上調(diào)用 submitApplication() 提交作業(yè)(步驟 4)。
2.作業(yè)初始化
- 當(dāng)資源管理器收到對其 submitApplication() 方法的調(diào)用時(shí),它會(huì)將請求移交給 YARN 調(diào)度程序。調(diào)度器分配一個(gè)容器,然后資源管理器啟動(dòng)appmaster。
- MapReduce 作業(yè)的app master是一個(gè) Java 應(yīng)用程序,初始化作業(yè)并跟蹤任務(wù)的完成進(jìn)度(步驟 6)。
- 接下來,它從共享文件系統(tǒng)中檢索在客戶端計(jì)算的輸入分片(步驟 7)。然后它為每個(gè)split創(chuàng)建一個(gè)map任務(wù)以及一些reduce任務(wù)。
- app master決定如何運(yùn)行構(gòu)成 MapReduce 作業(yè)的任務(wù)。如果作業(yè)很小,app master可能會(huì)選擇在與自己相同的 JVM 中運(yùn)行任務(wù)。
任務(wù)分配
- 如果該作業(yè)不符合與app master在相同的JVM中運(yùn)行的條件,app master會(huì)向資源管理器請求該作業(yè)中所有 map 和 reduce 任務(wù)的container(步驟 8)。
- 對 map 任務(wù)的請求首先進(jìn)行,并且具有比 reduce 任務(wù)更高的優(yōu)先級,因?yàn)樗?map 任務(wù)必須在 reduce 的排序階段開始之前完成。直到 5% 的 map 任務(wù)完成后才會(huì)請求 reduce 任務(wù)。
- Reduce 任務(wù)可以在集群中的任何位置運(yùn)行,但對 map 任務(wù)具有數(shù)據(jù)本地性的限制。
- 在最佳情況下,任務(wù)是本地?cái)?shù)據(jù),即在分片所在的同一節(jié)點(diǎn)上運(yùn)行?;蛘?,任務(wù)可能是機(jī)架本地的:與分片在同一機(jī)架上,但不在同一節(jié)點(diǎn)上。有些任務(wù)既不在同一節(jié)點(diǎn)又不在同一機(jī)架,而是需要從不同機(jī)架不同節(jié)點(diǎn)中檢索數(shù)據(jù)。
- 請求還指定了任務(wù)的內(nèi)存和CPU要求 。默認(rèn)情況下,每個(gè) map 和 reduce 任務(wù)都分配了 1024 MB 的內(nèi)存和一個(gè)虛擬內(nèi)核。
任務(wù)執(zhí)行
- 一旦資源管理器的調(diào)度程序?yàn)樘囟ü?jié)點(diǎn)上的容器分配了資源,app master將通過聯(lián)系nodemanager來啟動(dòng)容器(步驟 9a 和 9b)。
- 最后,它運(yùn)行 map 或 reduce 任務(wù)(步驟 11)。
作業(yè)完成
- 當(dāng)app master收到作業(yè)的最后一個(gè)任務(wù)已完成的通知時(shí),它會(huì)將作業(yè)的狀態(tài)更改為“成功”。
- 然后,當(dāng) Job 輪詢狀態(tài)時(shí),它得知作業(yè)已成功完成,會(huì)打印一條消息告訴用戶,然后從 waitForCompletion() 方法返回。
- 此時(shí)作業(yè)統(tǒng)計(jì)信息和計(jì)數(shù)器會(huì)打印到控制臺。
- 最后,在作業(yè)完成時(shí),app master和任務(wù)容器清理它們的工作狀態(tài)(中間輸出被刪除)。作業(yè)信息由作業(yè)歷史服務(wù)器存檔,以便用戶以后在需要時(shí)查詢。
總結(jié)
Hadoop生態(tài)系統(tǒng)是工業(yè)界應(yīng)用最廣泛的大數(shù)據(jù)生態(tài)系統(tǒng)。作為Hadoop 生態(tài)圈的重要一員,YARN在開源大數(shù)據(jù)領(lǐng)域有著重要的地位,很多計(jì)算框架都能夠運(yùn)行在YARN上,比如Spark,F(xiàn)link,Storm等。對于大多數(shù)公司的大數(shù)據(jù)計(jì)算場景,采用YARN來管理集群,是一個(gè)比較常見的解決方案。