1, YARN?概述
YARN?是“ Yet Another Resource Negotiator”的簡稱。在進一步了解?YARN?框架之前我們需要知道,相比較而言,?MapReduce?則是?YARN?的一個特例。?YARN?則是?MapReduce?的一個更加通用和高級的框架形式,并在其上增加了更多的功能。例如通過加載分布式執(zhí)行腳本可以在集群節(jié)點上執(zhí)行獨立的腳本任務,并且更多功能正在被追加中。所以我們可以看到,YARN?可以直接運行在?MapReduce?運行的框架上而不會造成更多的干擾,并且會為集群的運算帶來更多的好處。更一步的開發(fā)顯示了?YARN?會允許開發(fā)者根據(jù)自己的需求運行不同版本的?MapReduce?在集群中,這將為開發(fā)者提供更為便捷的服務。
普遍認為,云計算包括以下幾個層次的服務: IaaS、PaaS和SaaS。這里所謂的層次,是分層體系架構意義上的“層次”。laas. Paas、 Saas分別實現(xiàn)在基礎設施層、軟件開放運行平臺層、應用軟件層。
IaaS(Infrastructure-as-a-Service):基礎設施即服務。消費者通過Internet可以從完善的計算機基礎設施獲得服務。laas 通過網絡向用戶提供計算機(物理機和虛擬機)、存儲空間、網絡連接、負載均衡和防火墻等基本計算資源;用戶在此基礎上部署和運行各種軟件,包括操作系統(tǒng)和應用程序等。
PaaS(Platform-as-a-Service):平臺即服務。PaaS 是將軟件研發(fā)的平臺作為一種服務,以SaaS的模式提交給用戶。平臺通常包括操作系統(tǒng)、編程語言的運行環(huán)境、數(shù)據(jù)庫和Web服務器等,用戶可以在平臺上部署和運行自己的應用。通常而言,用戶不能管理和控制底層的基礎設施,只能控制自已部署的應用。
SaaS(Software-as-a-Service):軟件即服務。它是一種通過Internet提供軟件的模式,用戶無需購買軟件,而是向提供商租用基于Web的軟件,來管理企業(yè)經營活動。云提供商在云端安裝和運行應用軟件,云用戶通過云客戶端(比如Web瀏覽器)使用軟件。
? ? 從云計算分層概念上講,YARN可看做PAAS層,它能夠為不同類型的應用程序提供統(tǒng)一的管理和調度。
關于上圖架構 ,主要包括以下幾種角色
ResourceManager(RM):主要接收客戶端任務請求,接收和監(jiān)控NodeManager(NM)的資源情況匯報,負責資源的分配與調度,啟動和監(jiān)控ApplicationMaster(AM)。
NodeManager:主要是節(jié)點上的資源管理,啟動Container運行task計算,上報資源、container情況給RM和任務處理情況給AM。
ApplicationMaster:主要是單個Application(Job)的task管理和調度,向RM進行資源的申請,向NM發(fā)出launch Container指令,接收NM的task處理狀態(tài)信息。
ResourceManager是Yarn的核心, 負責調度Application master, 來給每個NodeManager分配資源, 資源儲存在Container中, 此處的資源包括JVM,內存等, 然后將程序copy到container中運行, container還需要回報狀態(tài)給App master, 再有app master匯報給Resource manager, nodeManager也要按時匯報ResourceManager當前節(jié)點的資源使用情況.
下面簡單介紹以下提交一個job的處理過程
1、client submit一個job到RM,進入RM中的Scheduler隊列供調度(Scheduler負責申請資源)
2、RM根據(jù)NM匯報的資源情況(NM會定時匯報資源和container使用情況),請求一個合適的NM launch container,以啟動運行AM
3、AM啟動后,注冊到RM上,以使client可以查到AM的信息,便于client直接和AM通信
4、AM啟動后,根據(jù)Job 相關的split的task情況,會和RM協(xié)商申請container資源
5、RM分配給AM container資源后,根據(jù)container的信息,向對應的NM 請求launch container
6、NM啟動container運行task,運行過程中向AM匯報進度狀態(tài)信息,類似于MRv1中 task的匯報;同時NM也會定時的向RM匯報container的使用情況。
7、在application(job)執(zhí)行過程中,client可以和AM通信,獲取application相關的進度和狀態(tài)信息。
8、在application(job)完成后,AM通知RM clear自己的相關信息,并關閉,釋放自己占用的container。
yarn分為一級調度管理和二級調度管理
一級調度管理(更近底層,更接近于操作資源, 更偏向于應用層和底層結合)
計算資源管理(cpu,內存等,計算復雜消耗的cpu多)
App生命周期管理
二級調度管理(自己代碼的算法等, 更偏向于應用層)
App內部的計算模型管理
多樣化的計算模型
????全局的資源管理器,整個集群只有一個,負責集群資源的統(tǒng)一管理和調度分配。
????功能: 處理客戶端請求
? ????? 啟動/監(jiān)控ApplicationMaster
???????監(jiān)控NodeManager
? ????? 資源分配與調度
????管理一個在YARN 內運行的應用程序的每個實例
功能
數(shù)據(jù)切分
為應用程序申請資源,并進一步分配給內部任務
????????任務監(jiān)控與容錯
負責協(xié)調來自ResourceManager的資源,幵通過NodeManager監(jiān)視容器的執(zhí)行和資源使用(CPU、內存等的資源分配)。
????整個集群有多個,負責單節(jié)點資源管理和使用
功能
單個節(jié)點上的資源管理和任務管理
處理來自ResourceManager的命令
????????處理來自ApplicationMaster的命令
NodeManager管理抽象容器,這些容器代表著可供一個特定應用程序使用的針對每個節(jié)點的資源。
定時地向RM匯報本節(jié)點上的資源使用情況和各個Container的運行狀態(tài)。
????YARN中的資源抽象,封裝某個節(jié)點上多維度資源,如內存、CPU、磁盤、網絡等,當AM向RM申請資源時,RM向AM返回的資源便是用Container表示的。YARN 會為每個任務分配一個Container,且該任務只能使用該Container中描述的資源。
功能
對任務運行環(huán)境的抽象
描述一系列信息
任務運行資源(節(jié)點、內存、CPU)
任務啟動命令
任務運行環(huán)境
其他組件還包括
作業(yè)歷史服務,記錄歷史情況 , 通過mr-jobhistory-daemon.sh start historyserver 來啟動, 啟動成功會出現(xiàn)JobHistoryServer進程 , 并且可以從19888端口進行查看日志詳細信息
用來寫日志服務數(shù)據(jù) , 一般來寫與第三方結合的日志服務數(shù)據(jù)(比如spark等)
? YARN利用異步模型對MapReduce框架的一些關鍵邏輯結構(如JobInprogress、TaskInProgress等)進行了重寫,相比于MRv1,具有更快地計算速度。
? YARN不再是一個單純的計算框架,而是一個框架管理器,用戶可以將各種各樣的計算框架移植到YARN之上。
在YARN中,各種計算框架不再是作為一個服務部署到集群的各個節(jié)點上(比如MapReduce框架,不再需要部署JobTracler、TaskTracker等服務),而是被封裝成一個用戶程序庫(lib)存放在客戶端,當需要對計算框架進行升級時,只需升級用戶程序庫即可。
RPC協(xié)議是連接各個組件的“大動脈”,了解不同組件之間的RPC協(xié)議有助于我們更深人地學習YARN框架。在YARN中,任何兩個需相互通信的組件之間僅有一個RPC協(xié)議,面對于任何一個RPC協(xié)議,通信雙方有一端是Client, 另一端為Server, 且Client總是主動連接 Server的,因此,YARN實際上采用的是拉式(ull-based) 通信模型。如下圖所示,箭頭指向的組件是RPC Server, 而箭頭尾部的組件是RPC Client, YARN主要由以下幾個RPC協(xié)議組成:
(1)JobClient(作業(yè)提交客戶端)與RM之間的協(xié)議---ApplicationClientProtocol :
JobClient通過該RPC協(xié)議提交應用程序、查詢應用程序狀態(tài)等。
(2)Admin(管理員)與RM之間的通信協(xié)議----ResourceManagerAdministrationProtocol:
Admin通過該RPC協(xié)議更新系統(tǒng)配置文件,比如節(jié)點黑白名單、用戶隊列權限等。
(3)AM與RM之間的協(xié)議一ApplicationMasterProtocol: AM通過該RPC協(xié)議向RM注冊和撒銷自己,并為各個任務申請資源。
(4)AM與NM之間的協(xié)議一-ContainerManagementProtocol: AM通過該RPC要求NM啟動或者停止Container,獲取各個Container的使用狀態(tài)等信息。
(5)NM與RM之間的協(xié)議一-ResuceTracker: NM通過該RPC協(xié)議向RM注冊,并定時發(fā)送心跳信息匯報當前節(jié)點的資源使用情況和Container運行情況。
???????資源調度和資源隔離是YARN作為一個資源管理系統(tǒng),最重要和最基礎的兩個功能。資源調度由ResourceManager完成,而資源隔離由各個NM實現(xiàn)。
???????ResourceManager將某個NodeManager上資源分配給任務(這就是所謂的“資源調度”)后,NodeManager需按照要求為任務提供相應的資源,甚至保證這些資源應具有獨占性,為任務運行提供基礎的保證,這就是所謂的資源隔離。
???????當談及到資源時,我們通常指內存,CPU和IO三種資源。Hadoop ?YARN同時支持內存和CPU兩種資源的調度。
????? ?內存資源的多少會會決定任務的生死,如果內存不夠,任務可能會運行失敗;相比之下,CPU資源則不同,它只會決定任務運行的快慢,不會對生死產生影響。
YARN允許用戶配置每個節(jié)點上可用的物理內存資源,注意,這里是“可用的”,因為一個節(jié)點上的內存會被若干個服務共享,比如一部分給YARN,一部分給HDFS,一部分給HBase等,YARN配置的只是自己可以使用的,配置參數(shù)如下:
? (1) yarn.nodemanager.resource.memory-mb
? 表示該節(jié)點上YARN可使用的物理內存總重,默認是8192(MB),注意,如果你的節(jié)點內存資源不夠8CB,則懦要調減這個值,而YARN不會智能的探測節(jié)點的物理內存總里。
? (2) yarn.nodemanager.vmem-pmem-ratio
? 任務每使用1MB物理內存,最多可使用虛擬內存里,默認是2.1.
? (3) yarn.nodemanager.pmem-check-enabled
? 是否啟動一個線程檢查每個任務正使用的物理內存里,如果任務超出分配值,則直接將其殺掉,默認是true
? (4) yarn.nodemanager.vmem-check-enabled
? 是否啟動一個線程檢查每個任務正使用的虛擬內存里,如果任務超出分配值,則直接將其殺掉,默認是true
? (5) yarn.scheduler.minimum-allocation-mb
? 單個任務可申請的最少物理內存里,默認是1024(MB),如果一個任務申請的物理內存重少于該值,則該對應的值改這個數(shù)。
? (6) yarn.scheduler.maximum-allocation-mb
?單個任務可申請的最多物理內存里,默認是8192(MB)。
默認情況下,YARN采用了線程監(jiān)控的方法判斷任務是否超量使用內存,一旦發(fā)現(xiàn)超量,則直接將其殺死。由于Cgroups對內存的控制缺乏靈活性(即任務任何時刻不能超過內存上限,如果超過,則直接將其殺死或者報OOM),而Java進程在創(chuàng)建瞬間內存將翻倍,之后驟降到正常值,這種情況下,采用線程監(jiān)控的方式更加靈活(當發(fā)現(xiàn)進程樹內存瞬間翻倍超過設定值時,可認為是正常現(xiàn)象,不會將任務殺死),因此YARN未提供Cgroups內存隔離機制。
目前的CPU被劃分成虛擬CPU(CPU virtual Core),這里的虛擬CPU是YARN自己引入的概念,初衷是,考慮到不同節(jié)點的CPU性能可能不同,每個CPU具有的計算能力也是不一樣的,比如某個物理CPU的計算能力可能是另外一個物理CPU的2倍,這時候,你可以通過為第一個物理CPU多配置幾個虛擬CPU彌補這種差異。用戶提交作業(yè)時,可以指定每個任務需要的虛擬CPU個數(shù)。在YARN中,CPU相關配置參數(shù)如下:
? (1) yarn.nodemanager.resource.cpu-vcores
? ????表示該節(jié)點上YARN可使用的虛擬CPU個數(shù), 默認是8.注意.目前推薦將該值設為與物理CPU核數(shù)數(shù)目相同,如果你的節(jié)點CPU核數(shù)不8個,則懦要調小這個值,而YARN不會智能的探測點物理CPU總數(shù).
? (2) yarn.scheduler.minimum-allocation-vcores
? ? ? ?單個任務可申請的最小虛擬cpu個數(shù)默認是1, 如果一個任務申請的CPU個數(shù)少于該數(shù).則該對應的值改為這個數(shù).
? (3) yarn.scheduler.maximum-allocation-vcores
? ? ? ?單個任務可申請的最多虛擬CPU個數(shù),默認是32。
用戶向YARN ResourceManager提交應用程序,RM收到提交申請后,先向資源調度器申請用以啟動AM 的資源,待申請到資源后,再由ApplicationMasterLauncher與對應的NodeManager通信,從而啟動應用程序的ApplicationMaster。
ApplicationMaster啟動完成后,ApplicationMasterLaucher會通過事件的形式,將剛剛啟動的Application Master注冊到AMLiveMonitor,以啟動心跳監(jiān)控。
ApplicationMaster啟動后,先向ApplicatinMaterService注冊,并將自己所在host、端口號等信息匯報給它。
AM運行過程中,周期性地向ApplicationMaserService回報心跳信息(信息中包含想要申請的資源描述)。
ApplicationMasterService每次收到ApplicationMaster心跳信息好后,將通知AMLivelinessMonitor更新應用程序的最新回報心跳的時間。
應用程序運行完成后,AM向AMService發(fā)送請求,注銷自己。
AMService收到注銷請求后,標注應用程序運行狀態(tài)完成,同時通知AMLivelinessMonitor移除對它的心跳監(jiān)控。
想學習大數(shù)據(jù)或者對大數(shù)據(jù)技術感興趣的朋友,這里我整理了一套大數(shù)據(jù)的學習視頻免費分享給大家,從入門到實戰(zhàn)都有,大家可以加我的微信:Lxiao_28獲取!(備注領取資料)。也歡迎進微信群交流,或者獲取Java高級技術學習資料。
? ?長按識別關注我們,發(fā)現(xiàn)更多精彩內容分享哦? ~ ~