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
表示的。YARN會為每個任務分配一個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
參考資料
初步掌握Yarn的架構及原理
Apache Hadoop 2.9.2 > Apache Hadoop YARN
更多大資料系列文章可以參見個人 GitHub 開源專案: 大資料入門指南