Hadoop 系列(二)—— 叢集資源管理器 YARN
一、hadoop yarn 簡介
Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的叢集資源管理系統。使用者可以將各種服務框架部署在 YARN 上,由 YARN 進行統一地管理和資源分配。
二、YARN架構
1. ResourceManager
ResourceManager
通常在獨立的機器上以後臺程式的形式執行,它是整個叢集資源的主要協調者和管理者。ResourceManager
負責給使用者提交的所有應用程式分配資源,它根據應用程式優先順序、佇列容量、ACLs、資料位置等資訊,做出決策,然後以共享的、安全的、多租戶的方式制定分配策略,排程叢集資源。
2. NodeManager
NodeManager
是 YARN 叢集中的每個具體節點的管理者。主要負責該節點內所有容器的生命週期的管理,監視資源和跟蹤節點健康。具體如下:
- 啟動時向
ResourceManager
註冊並定時傳送心跳訊息,等待ResourceManager
的指令; - 維護
Container
的生命週期,監控Container
的資源使用情況; - 管理任務執行時的相關依賴,根據
ApplicationMaster
的需要,在啟動Container
之前將需要的程式及其依賴拷貝到本地。
3. ApplicationMaster
在使用者提交一個應用程式時,YARN 會啟動一個輕量級的程式 ApplicationMaster
ApplicationMaster
負責協調來自 ResourceManager
的資源,並通過 NodeManager
監視容器內資源的使用情況,同時還負責任務的監控與容錯。具體如下:
- 根據應用的執行狀態來決定動態計算資源需求;
- 向
ResourceManager
申請資源,監控申請的資源的使用情況; - 跟蹤任務狀態和進度,報告資源的使用情況和應用的進度資訊;
- 負責任務的容錯。
4. Contain
Container
是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁碟、網路等。當 AM 向 RM 申請資源時,RM 為 AM 返回的資源是用 Container
Container
,該任務只能使用該 Container
中描述的資源。ApplicationMaster
可在 Container
內執行任何型別的任務。例如,MapReduce ApplicationMaster
請求一個容器來啟動 map 或 reduce 任務,而 Giraph ApplicationMaster
請求一個容器來執行 Giraph 任務。
三、YARN工作原理簡述
-
Client
提交作業到 YARN 上; -
Resource Manager
選擇一個Node Manager
,啟動一個Container
並執行Application Master
例項; -
Application Master
根據實際需要向Resource Manager
請求更多的Container
資源(如果作業很小,應用管理器會選擇在其自己的 JVM 中執行任務); -
Application Master
通過獲取到的Container
資源執行分散式計算。
四、YARN工作原理詳述
1. 作業提交
client 呼叫 job.waitForCompletion 方法,向整個叢集提交 MapReduce 作業 (第 1 步) 。新的作業 ID(應用 ID) 由資源管理器分配 (第 2 步)。作業的 client 核實作業的輸出,計算輸入的 split,將作業的資源 (包括 Jar 包,配置檔案,split 資訊) 拷貝給 HDFS(第 3 步)。 最後,通過呼叫資源管理器的 submitApplication() 來提交作業 (第 4 步)。
2. 作業初始化
當資源管理器收到 submitApplciation() 的請求時,就將該請求發給排程器 (scheduler),排程器分配 container,然後資源管理器在該 container 內啟動應用管理器程式,由節點管理器監控 (第 5 步)。
MapReduce 作業的應用管理器是一個主類為 MRAppMaster 的 Java 應用,其通過創造一些 bookkeeping 物件來監控作業的進度,得到任務的進度和完成報告 (第 6 步)。然後其通過分散式檔案系統得到由客戶端計算好的輸入 split(第 7 步),然後為每個輸入 split 建立一個 map 任務,根據 mapreduce.job.reduces 建立 reduce 任務物件。
3. 任務分配
如果作業很小,應用管理器會選擇在其自己的 JVM 中執行任務。
如果不是小作業,那麼應用管理器向資源管理器請求 container 來執行所有的 map 和 reduce 任務 (第 8 步)。這些請求是通過心跳來傳輸的,包括每個 map 任務的資料位置,比如存放輸入 split 的主機名和機架 (rack),排程器利用這些資訊來排程任務,儘量將任務分配給儲存資料的節點,或者分配給和存放輸入 split 的節點相同機架的節點。
4. 任務執行
當一個任務由資源管理器的排程器分配給一個 container 後,應用管理器通過聯絡節點管理器來啟動 container(第 9 步)。任務由一個主類為 YarnChild 的 Java 應用執行, 在執行任務之前首先本地化任務需要的資源,比如作業配置,JAR 檔案,以及分散式快取的所有檔案 (第 10 步。 最後,執行 map 或 reduce 任務 (第 11 步)。
YarnChild 執行在一個專用的 JVM 中,但是 YARN 不支援 JVM 重用。
5. 進度和狀態更新
YARN 中的任務將其進度和狀態 (包括 counter) 返回給應用管理器,客戶端每秒 (通 mapreduce.client.progressmonitor.pollinterval 設定) 嚮應用管理器請求進度更新,展示給使用者。
6. 作業完成
除了嚮應用管理器請求作業進度外,客戶端每 5 分鐘都會通過呼叫 waitForCompletion() 來檢查作業是否完成,時間間隔可以通過 mapreduce.client.completion.pollinterval 來設定。作業完成之後,應用管理器和 container 會清理工作狀態, OutputCommiter 的作業清理方法也會被呼叫。作業的資訊會被作業歷史伺服器儲存以備之後使用者核查。
五、提交作業到YARN上執行
這裡以提交 Hadoop Examples 中計算 Pi 的 MApReduce 程式為例,相關 Jar 包在 Hadoop 安裝目錄的 share/hadoop/mapreduce
目錄下:
# 提交格式: hadoop jar jar包路徑 主類名稱 主類引數
# hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.15.2.jar pi 3 3
複製程式碼
參考資料
更多大資料系列文章可以參見 GitHub 開源專案: 大資料入門指南