一、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
如果覺得對你有所幫助。記得收藏和關注呦!(每日更新各種框架)
如需轉載請註明出處(創作不易請見諒)
和巨嬰程序猿一起成長。讓自己變得更優秀
我最近一直在思考(大數據通俗講解)的問題,你的看法是什麼呢?關注我快說出來一起交流一下吧~