一、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
參考資料
更多大資料系列文章可以參見 GitHub 開源專案: 大資料入門指南