本文主要從yarn的基礎架構和yarn的作業執行流程進行闡述
一、yarn的概述
Apache Yarn(Yet Another Resource Negotiator的縮寫)是hadoop集群資源管理器系統,Yarn從hadoop 2引入,最初是為了改善MapReduce的實現,但是它具有通用性,同樣執行其他分布式計算模式。
在MapReduce1中,具有如下局限性:
1、擴展性差:jobtracker兼顧資源管理和作業控制跟蹤功能跟蹤任務,啟動失敗或遲緩的任務,記錄任務的執行狀態,維護計數器),壓力大,成為系統的瓶頸
2、可靠性差:采用了master/slave結構,master容易單點故障
3、資源利用率低:基於槽位的資源分配模型,槽位是一種粗粒度的資源划分單位,通常一個任務不會用完一個槽位的資源,hadoop1分為map slot和reduce slot,而它們之間資源不共享,造成一些資源空閑。
4、不支持多框架:不支持多種計算框架並行
yarn很好解決了MapReduce1中的局限性:yarn基本思想;一個全局的資源管理器resourcemanager和與每個應用對用的ApplicationMaster,Resourcemanager和NodeManager組成全新的通用系統,以分布式的方式管理應用程序。
所以針對MapReduce1,yarn就有了如下特點:
1、支持非mapreduce應用的需求
2、可擴展性
3、提高資源是用率
4、用戶敏捷性
5、可以通過搭建為高可用
二、yarn架構組件
Yarn從整體上還是屬於master/slave模型,主要依賴於三個組件來實現功能,第一個就是ResourceManager,是集群資源的仲裁者,它包括兩部分:一個是可插拔式的調度Scheduler,一個是ApplicationManager,用於管理集群中的用戶作業。第二個是每個節點上的NodeManager,管理該節點上的用戶作業和工作流,也會不斷發送自己Container使用情況給ResourceManager。第三個組件是ApplicationMaster,用戶作業生命周期的管理者它的主要功能就是向ResourceManager(全局的)申請計算資源(Containers)並且和NodeManager交互來執行和監控具體的task。架構圖如下:
2.1、Resourcemanager
ResourceManager 擁有系統所有資源分配的決定權,負責集群中所有應用程序的資源分配,擁有集群資源主要、全局視圖。因此為用戶提供公平的,基於容量的,本地化資源調度。根據程序的需求,調度優先級以及可用資源情況,動態分配特定節點運行應用程序。它與每個節點上的NodeManager和每一個應用程序的ApplicationMaster協調工作。
ResourceManager的主要職責在於調度,即在競爭的應用程序之間分配系統中的可用資源,並不關注每個應用程序的狀態管理。
ResourceManager主要有兩個組件:Scheduler和ApplicationManager:Scheduler是一個資源調度器,它主要負責協調集群中各個應用的資源分配,保障整個集群的運行效率。Scheduler的角色是一個純調度器,它只負責調度Containers,不會關心應用程序監控及其運行狀態等信息。同樣,它也不能重啟因應用失敗或者硬件錯誤而運行失敗的任務。
2.1.1、Scheduler
Scheduler是一個可插拔的插件,負責各個運行中的應用的資源分配,受到資源容量,隊列以及其他因素的影響。是一個純粹的調度器,不負責應用程序的監控和狀態追蹤,不保證應用程序的失敗或者硬件失敗的情況對task重啟,而是基於應用程序的資源需求執行其調度功能,使用了叫做資源container的概念,其中包括多種資源,比如,cpu,內存,磁盤,網絡等。在Hadoop的MapReduce框架中主要有三種Scheduler:FIFO Scheduler,Capacity Scheduler和Fair Scheduler。
FIFO Scheduler:先進先出,不考慮作業優先級和范圍,適合低負載集群。
Capacity Scheduler:將資源分為多個隊列,允許共享集群,有保證每個隊列最小資源的使用。
Fair Scheduler:公平的將資源分給應用的方式,使得所有應用在平均情況下隨着時間得到相同的資源份額。
2.1.2、ApplicationManager
ApplicationManager主要負責接收job的提交請求,為應用分配第一個Container來運行ApplicationMaster,還有就是負責監控ApplicationMaster,在遇到失敗時重啟ApplicationMaster運行的Container
2.2、NodeManager
NodeManager是yarn節點的一個“工作進程”代理,管理hadoop集群中獨立的計算節點,主要負責與ResourceManager通信,負責啟動和管理應用程序的container的生命周期,監控它們的資源使用情況(cpu和內存),跟蹤節點的監控狀態,管理日志等。並報告給RM。
NodeManager在啟動時,NodeManager向ResourceManager注冊,然后發送心跳包來等待ResourceManager的指令,主要目的是管理resourcemanager分配給它的應用程序container。NodeManager只負責管理自身的Container,它並不知道運行在它上面應用的信息。在運行期,通過NodeManager和ResourceManager協同工作,這些信息會不斷被更新並保障整個集群發揮出最佳狀態
主要職責:
1、接收ResourceManager的請求,分配Container給應用的某個任務
2、和ResourceManager交換信息以確保整個集群平穩運行。ResourceManager就是通過收集每個NodeManager的報告信息來追蹤整個集群健康狀態的,而NodeManager負責監控自身的健康狀態。
3、管理每個Container的生命周期
4、管理每個節點上的日志
5、執行Yarn上面應用的一些額外的服務,比如MapReduce的shuffle過程
2.2.1、Container
Container是Yarn框架的計算單元,是具體執行應用task(如map task、reduce task)的基本單位。Container和集群節點的關系是:一個節點會運行多個Container,但一個Container不會跨節點。
一個Container就是一組分配的系統資源,現階段只包含兩種系統資源(之后可能會增加磁盤、網絡、GPU等資源),由NodeManager監控,Resourcemanager調度。
每一個應用程序從ApplicationMaster開始,它本身就是一個container(第0個),一旦啟動,ApplicationMaster就會更加任務需求與Resourcemanager協商更多的container,在運行過程中,可以動態釋放和申請container。
2.3、ApplicationMaster
ApplicationMaster負責與scheduler協商合適的container,跟蹤應用程序的狀態,以及監控它們的進度,ApplicationMaster是協調集群中應用程序執行的進程。每個應用程序都有自己的ApplicationMaster,負責與ResourceManager協商資源(container)和NodeManager協同工作來執行和監控任務 。
當一個ApplicationMaster啟動后,會周期性的向resourcemanager發送心跳報告來確認其健康和所需的資源情況,在建好的需求模型中,ApplicationMaster在發往resourcemanager中的心跳信息中封裝偏好和限制,在隨后的心跳中,ApplicationMaster會對收到集群中特定節點上綁定了一定的資源的container的租約,根據Resourcemanager發來的container,ApplicationMaster可以更新它的執行計划以適應資源不足或者過剩,container可以動態的分配和釋放資源。
三、yarn作業調度流程
Application在Yarn中的執行過程如下圖所示:
1、客戶端程序向ResourceManager提交應用並請求一個ApplicationMaster實例,ResourceManager在應答中給出一個applicationID以及有助於客戶端請求資源的資源容量信息。
2、ResourceManager找到可以運行一個Container的NodeManager,並在這個Container中啟動ApplicationMaster實例
Application Submission Context發出響應,其中包含有:ApplicationID,用戶名,隊列以及其他啟動ApplicationMaster的信息,
Container Launch Context(CLC)也會發給ResourceManager,CLC提供了資源的需求,作業文件,安全令牌以及在節點啟動ApplicationMaster所需要的其他信息。
當ResourceManager接收到客戶端提交的上下文,就會給ApplicationMaster調度一個可用的container(通常稱為container0)。然后ResourceManager就會聯系NodeManager啟動ApplicationMaster,並建立ApplicationMaster的RPC端口和用於跟蹤的URL,用來監控應用程序的狀態。
3、ApplicationMaster向ResourceManager進行注冊,注冊之后客戶端就可以查詢ResourceManager獲得自己ApplicationMaster的詳細信息,以后就可以和自己的ApplicationMaster直接交互了。在注冊響應中,ResourceManager會發送關於集群最大和最小容量信息,
4、在平常的操作過程中,ApplicationMaster根據resource-request協議向ResourceManager發送resource-request請求,ResourceManager會根據調度策略盡可能最優的為ApplicationMaster分配container資源,作為資源請求的應答發個ApplicationMaster
5、當Container被成功分配之后,ApplicationMaster通過向NodeManager發送container-launch-specification信息來啟動Container, container-launch-specification信息包含了能夠讓Container和ApplicationMaster交流所需要的資料,一旦container啟動成功之后,ApplicationMaster就可以檢查他們的狀態,Resourcemanager不在參與程序的執行,只處理調度和監控其他資源,Resourcemanager可以命令NodeManager殺死container,
6、應用程序的代碼在啟動的Container中運行,並把運行的進度、狀態等信息通過application-specific協議發送給ApplicationMaster,隨着作業的執行,ApplicationMaster將心跳和進度信息發給ResourceManager,在這些心跳信息中,ApplicationMaster還可以請求和釋放一些container。
7、在應用程序運行期間,提交應用的客戶端主動和ApplicationMaster交流獲得應用的運行狀態、進度更新等信息,交流的協議也是application-specific協議
8、一但應用程序執行完成並且所有相關工作也已經完成,ApplicationMaster向ResourceManager取消注冊然后關閉,用到所有的Container也歸還給系統,當container被殺死或者回收,Resourcemanager都會通知NodeManager聚合日志並清理container專用的文件。
更多hadoop生態文章見: hadoop生態系列
參考:
https://hadoop.apache.org/docs/r2.7.7/hadoop-yarn/hadoop-yarn-site/YARN.html
《hadoop yarn權威指南》