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