1. 程式人生 > >[Note] Yet Another Resource Negotiator

[Note] Yet Another Resource Negotiator

cat 包括 圖片 純粹 reduce 應用程序管理 mapreduce 作業調度 思路

Yet Another Resource Negotiator

Apache Hadoop YARN 是新一代資源管理調度框架,主要針對 Hadoop MapReduce 1.0 的缺陷做出了改進

MapReduce 1.0 的缺陷

MapReduce 1.0 采用 Master/Slave 架構設計,包括一個 JobTracker 和若幹個 TaskTracker

前者負責作業調度和資源管理,後者負責執行 JobTracker 指派的具體任務

這種架構設計有以下的缺陷

  1. 單點故障問題(single point of failure),單一的 JobTracker 負責所有 MapReduce 作業的調度

  2. JobTracker 負載過重,JobTracker 既要負責作業調度和失敗回復,又要負責資源管理分配,導致一旦 MapReduce 任務過多,JobTracker 需要的內存開銷就過大,容易引起 JobTracker 失敗,因此 MapReduce 1.0 支持的主機數目的上限僅約為 4000 個

  3. TaskTracker 的內存溢出,在 TaskTracker 端,資源的分配並不考慮 CPU 和內存的實際使用情況,而是根據 MapReduce 任務的個數來分配資源,當兩個具有較大內存消耗的任務分配到同一個 TaskTracker 上時,容易發生內存溢出

  4. 資源的不合理劃分,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 程序,從提交到完成作為例子

  1. 用戶編寫客戶端應用程序,向 YARN 提交應用程序,提交的內容包括 ApplicationMaster 程序,啟動 ApplicationMaster 的命令和用戶程序等

  2. YARN 中的 ResourceManager 負責接收和處理來自客戶端的請求,接到客戶端應用程序請求後,ResourceManager 裏面的調度器回味應用程序分配一個容器。同時,ResourceManager 的應用程序管理器會與該容器所在的 NodeManager 通信,為該應用程序在該容器中啟動一個 ApplicationMaster

  3. ApplicationMaster 被創建後首先向 ResourceManager 註冊,從而使得用戶可以通過 ResourceManager 來直接查看應用程序的運行狀態,步驟 4 到 7 是應用程序的執行步驟

  4. ApplicationMaster 采用輪詢的方式通過 RPC(remote procedure call)協議向 ResourceManager 申請資源

  5. ResourceManager 以容器的形式向提出申請的 ApplicationMaster 分配資源,ApplicationMaster 申請到資源後,與該容器所在的 NodeManager 通信,要求它啟動任務

  6. 當 ApplicationMaster 要求容器啟動任務時,ApplicationMaster 會為任務設置好運行環境,包括環境變量,jar 包和二進制程序等,然後將任務啟動命令寫到一個腳本中,最後通過在容器中運行該腳本來啟動任務

  7. 各個任務通過某個 RPC 協議向 ApplicationMaster 匯報自己的狀態和進度,讓 ApplicationMaster 隨時掌握任務運行狀態,以便在任務失敗時重啟任務

  8. 應用程序運行完成後,ApplicationMaster 向 ResourceManager 的應用程序管理器註銷並關閉自己

[Note] Yet Another Resource Negotiator