[Note] Yet Another Resource Negotiator
Apache Hadoop YARN 是新一代資源管理調度框架,主要針對 Hadoop MapReduce 1.0 的缺陷做出了改進
MapReduce 1.0 的缺陷
MapReduce 1.0 采用 Master/Slave 架構設計,包括一個 JobTracker 和若幹個 TaskTracker
前者負責作業調度和資源管理,後者負責執行 JobTracker 指派的具體任務
這種架構設計有以下的缺陷
-
單點故障問題(single point of failure),單一的 JobTracker 負責所有 MapReduce 作業的調度
-
JobTracker 負載過重,JobTracker 既要負責作業調度和失敗回復,又要負責資源管理分配,導致一旦 MapReduce 任務過多,JobTracker 需要的內存開銷就過大,容易引起 JobTracker 失敗,因此 MapReduce 1.0 支持的主機數目的上限僅約為 4000 個
-
TaskTracker 的內存溢出,在 TaskTracker 端,資源的分配並不考慮 CPU 和內存的實際使用情況,而是根據 MapReduce 任務的個數來分配資源,當兩個具有較大內存消耗的任務分配到同一個 TaskTracker 上時,容易發生內存溢出
-
資源的不合理劃分,CPU 和內存的資源被強制等量劃分成多個插槽(slot),插槽又被進一步劃分為 Map 插槽和 Reduce 插槽兩種,分別提供給 Map 任務和 Reduce 任務使用,彼此之間不能使用分配給對方的插槽。這會導致當 Map 任務已經用完 Map 插槽時,即使系統中還有大量空閑的 Reduce 插槽,也不能拿來運行 Map 任務,反之亦然。從而當系統中一種任務滿負荷,另一種幾乎空閑時,會造成資源的浪費
YARN 的設計思路
YARN 的基本設計思路是放權,即通過把原 JobTracker 的三個主要功能,資源管理,任務調度和任務監控進行拆分,分別交給不同的新組件去管理,來改變原來 JobTracker 負擔過重的情況
YARN 包括 ResourceManager,ApplicationMaster 和 NodeManager
ResourceManager 負責資源管理,ApplicationMaster 負責任務調度和監控,NodeManager 負責具體執行任務
此前在 Hadoop 1.0 中,MapReduce 1.0 既是一個計算框架,也是一個資源管理調度框架,到了 Hadoop 2.0 以後,MapReduce 1.0 的資源管理調度功能分離重構為 YARN,YARN 是一個純粹的資源管理調度框架,而原來的 MapReduce 變為 MapReduce 2.0,是一個運行在 YARN 上的純粹計算框架,不再自己負責資源管理調度,轉而由 YARN 提供資源管理調度服務
YARN 的體系結構
組件(Component) | 功能 |
---|---|
ResourceManager | ①處理客戶端請求 ②啟動/監控 ApplicationMaster ③監控 NodeManager ④資源分配與調度 |
ApplicationMaster | ①申請資源給應用程序,並把內部任務分配給應用程序 ②任務的調度,監控和容錯 |
NodeManager | ①單個節點上的資源管理 ②處理來自 ResourceManager 的命令 ③處理來自 ApplicationMaster 的命令 |
YARN 中以容器(Container)作為動態資源分配單位,相比 MapReduce 1.0 使用基於任務數目的插槽,容器內封裝了一定數量的 CPU,內存和磁盤等資源,從而限定每個應用程序可以使用的資源量
YARN 的工作流程
下面以在 YARN 框架中執行一個 MapReduce 程序,從提交到完成作為例子
-
用戶編寫客戶端應用程序,向 YARN 提交應用程序,提交的內容包括 ApplicationMaster 程序,啟動 ApplicationMaster 的命令和用戶程序等
-
YARN 中的 ResourceManager 負責接收和處理來自客戶端的請求,接到客戶端應用程序請求後,ResourceManager 裏面的調度器回味應用程序分配一個容器。同時,ResourceManager 的應用程序管理器會與該容器所在的 NodeManager 通信,為該應用程序在該容器中啟動一個 ApplicationMaster
-
ApplicationMaster 被創建後首先向 ResourceManager 註冊,從而使得用戶可以通過 ResourceManager 來直接查看應用程序的運行狀態,步驟 4 到 7 是應用程序的執行步驟
-
ApplicationMaster 采用輪詢的方式通過 RPC(remote procedure call)協議向 ResourceManager 申請資源
-
ResourceManager 以容器的形式向提出申請的 ApplicationMaster 分配資源,ApplicationMaster 申請到資源後,與該容器所在的 NodeManager 通信,要求它啟動任務
-
當 ApplicationMaster 要求容器啟動任務時,ApplicationMaster 會為任務設置好運行環境,包括環境變量,jar 包和二進制程序等,然後將任務啟動命令寫到一個腳本中,最後通過在容器中運行該腳本來啟動任務
-
各個任務通過某個 RPC 協議向 ApplicationMaster 匯報自己的狀態和進度,讓 ApplicationMaster 隨時掌握任務運行狀態,以便在任務失敗時重啟任務
-
應用程序運行完成後,ApplicationMaster 向 ResourceManager 的應用程序管理器註銷並關閉自己
[Note] Yet Another Resource Negotiator