您好,登錄后才能下訂單哦!
[TOC]
? 在Hadoop1.x中,MapReduce中本身負(fù)責(zé)資源的調(diào)度以及業(yè)務(wù)邏輯運(yùn)算,耦合度較大,而且當(dāng)時(shí)只支持MapReduce一個(gè)框架。
? 在Hadoop2.x中,增加了yarn,專門負(fù)責(zé)資源的調(diào)度,MapReduce只負(fù)責(zé)業(yè)務(wù)邏輯運(yùn)算,而且yarn之上可以運(yùn)算其他的分布式計(jì)算框架,如spark等。
? 圖2.1 yarn基本結(jié)構(gòu)
主要分為 RM(ResourceManager),NM(NodeManager)、AM(ApplicationMaster)。
資源:
在 YARN 的語境下,資源特指計(jì)算資源,包括 CPU 和內(nèi)存。計(jì)算機(jī)的每個(gè)進(jìn)程都會(huì)占用一定的 CPU 和內(nèi)存,任務(wù)需要先向 RM 申請(qǐng)到資源后才能獲準(zhǔn)在 NM 上啟動(dòng)自己的進(jìn)程。
隊(duì)列:
YARN 將整個(gè)集群的資源劃分為隊(duì)列,每個(gè)用戶的任務(wù)必須提交到指定隊(duì)列。同時(shí)限制每個(gè)隊(duì)列的大小,防止某個(gè)用戶的任務(wù)占用整個(gè)集群,影響了其他用戶的使用。
vcore、Mem:
邏輯 CPU 和邏輯內(nèi)存,每個(gè) NM 會(huì)向 RM 匯報(bào)自己有多少 vcore 和內(nèi)存可用,具體數(shù)值由集群管理員配置。比如一臺(tái)48核,128G內(nèi)存的機(jī)器,可以配置40vcore,120G內(nèi)存,意為可以對(duì)外提供這么多資源。具體數(shù)值可能根據(jù)實(shí)際情況有所調(diào)整。每個(gè) NM 的邏輯資源加起來,就是整個(gè)集群的總資源量。
MinResources & MaxResources:
為了使每個(gè)隊(duì)列都能得到一定的資源,同時(shí)又不浪費(fèi)集群的空閑資源,隊(duì)列的資源設(shè)置都是“彈性”的。每個(gè)隊(duì)列都有 min 和 max 兩個(gè)資源值,min 表示只要需求能達(dá)到,集群一定會(huì)提供這么多資源;如果資源需求超過了 min 值而同時(shí)集群仍有空閑資源,則仍然可以滿足;但又限制了資源不能無限申請(qǐng)以免影響其他任務(wù),資源的分配不會(huì)超過 max 值。這里是指整個(gè)隊(duì)列獲得的資源總數(shù)
container:
任務(wù)申請(qǐng)到資源后在 NM 上啟動(dòng)的進(jìn)程統(tǒng)稱 Container。比如在 MapReduce 中可以是 Mapper 或 Reducer,在 Spark 中可以是 Driver 或 Executor。
RM(ResourceManager),NM(NodeManager)、AM(ApplicationMaster):
ResourceManager(rm):
處理客戶端請(qǐng)求、啟動(dòng)/監(jiān)控ApplicationMaster、監(jiān)控NodeManager、資源分配與調(diào)度
NodeManager(nm):
單個(gè)節(jié)點(diǎn)上的資源管理、處理來自ResourceManager的命令、處理來自ApplicationMaster的命令
ApplicationMaster:
數(shù)據(jù)切分、為應(yīng)用程序申請(qǐng)資源,并分配給內(nèi)部任務(wù)、任務(wù)監(jiān)控與容錯(cuò)。其實(shí)就是MapReduce任務(wù)的driver端程序運(yùn)行的地方。用于任務(wù)的調(diào)度。前面的RM和NM都是用于資源調(diào)度
1)用戶使用客戶端向 RM 提交一個(gè)任務(wù)job,同時(shí)指定提交到哪個(gè)隊(duì)列和需要多少資源。用戶可以通過每個(gè)計(jì)算引擎的對(duì)應(yīng)參數(shù)設(shè)置,如果沒有特別指定,則使用默認(rèn)設(shè)置。
2)RM 在收到任務(wù)提交的請(qǐng)求后,先根據(jù)資源和隊(duì)列是否滿足要求選擇一個(gè) NM,通知它啟動(dòng)一個(gè)特殊的 container,稱為 ApplicationMaster(AM),后續(xù)流程由它發(fā)起。每個(gè)任務(wù)只有一個(gè)AM。
3)AM 向 RM 注冊(cè)后根據(jù)自己任務(wù)的需要,向 RM 申請(qǐng) container,包括數(shù)量、所需資源量、所在位置等因素。
4)如果隊(duì)列有足夠資源,RM 會(huì)將 container 分配給有足夠剩余資源的 NM,由 AM 通知 NM 啟動(dòng) container。
5)container 啟動(dòng)后執(zhí)行具體的任務(wù),處理分給自己的數(shù)據(jù)。NM 除了負(fù)責(zé)啟動(dòng) container,還負(fù)責(zé)監(jiān)控它的資源使用狀況以及是否失敗退出等工作,如果 container 實(shí)際使用的內(nèi)存超過申請(qǐng)時(shí)指定的內(nèi)存,會(huì)將其殺死,保證其他 container 能正常運(yùn)行。
6)各個(gè) container 向 AM 匯報(bào)自己的進(jìn)度,都完成后,AM 向 RM 注銷任務(wù)并退出,RM 通知 NM 殺死對(duì)應(yīng)的 container,任務(wù)結(jié)束。
? 圖3.1 yarn工作機(jī)制
(0)Mr程序提交到客戶端所在的節(jié)點(diǎn)。
(1)Yarnrunner向Resourcemanager申請(qǐng)一個(gè)Application
(2)RM將該應(yīng)用程序的資源路徑返回給yarnrunner。
(3)該程序?qū)⑦\(yùn)行所需資源提交到HDFS上,放到hdfs指定目錄下,如上圖所示,資源主要有3部分,一是所有切片信息的規(guī)劃文件,二是job的一個(gè)運(yùn)行配置文件(包含job的一些運(yùn)行參數(shù)等),三是MapReduce程序的jar包了
(4)程序資源提交完畢后,申請(qǐng)運(yùn)行mrAppMaster。
(5)RM將用戶的請(qǐng)求初始化成一個(gè)task。
(6)其中一個(gè)NodeManager領(lǐng)取到task任務(wù)。
(7)該NodeManager創(chuàng)建容器Container,并產(chǎn)生MRAppmaster。
(8)Container從HDFS上拷貝資源到本地。
(9)MRAppmaster向RM 申請(qǐng)運(yùn)行maptask資源。
(10)RM將運(yùn)行maptask任務(wù)分配給另外兩個(gè)NodeManager,另兩個(gè)NodeManager分別領(lǐng)取任務(wù)并創(chuàng)建容器
(11)MR向兩個(gè)接收到任務(wù)的NodeManager發(fā)送程序啟動(dòng)腳本,這兩個(gè)NodeManager分別啟動(dòng)maptask,maptask對(duì)數(shù)據(jù)分區(qū)排序。
(12)MrAppMaster等待所有maptask運(yùn)行完畢后,向RM申請(qǐng)容器,運(yùn)行reduce task。
(13)reduce task向maptask獲取相應(yīng)分區(qū)的數(shù)據(jù)。
(14)程序運(yùn)行完畢后,appMaster會(huì)向RM申請(qǐng)注銷自己。
yarn會(huì)為任務(wù)分配資源,這個(gè)過程中涉及到資源的調(diào)度,目前yarn支持的資源調(diào)度器有三種:FIFO、capacity scheduler、fair scheduler。目前默認(rèn)的是 capacity scheduler
//yarn-default.xml
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
? 圖4.1 FIFO調(diào)度器
優(yōu)點(diǎn):調(diào)度算法簡(jiǎn)單,JobTracker(job提交任務(wù)后發(fā)送得地方)工作負(fù)擔(dān)輕。
缺點(diǎn):忽略了不同作業(yè)的需求差異。例如如果類似對(duì)海量數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析的作業(yè)長(zhǎng)期占據(jù)計(jì)算資源,那么在其后提交的交互型作業(yè)有可能遲遲得不到處理,從而影響到用戶的體驗(yàn)。
? 圖 4.2 capacity scheduler調(diào)度器
1.多隊(duì)列支持,每個(gè)隊(duì)列采用FIFO
2.為了防止同一個(gè)用戶的作業(yè)獨(dú)占隊(duì)列中的資源,該調(diào)度器會(huì)對(duì)同一個(gè)用戶提交多的作業(yè)所占資源量進(jìn)行限定
3.首先,計(jì)算每個(gè)隊(duì)列中正在運(yùn)行的任務(wù)數(shù)與其應(yīng)該分得的計(jì)算資源(隊(duì)列中已有任務(wù)總共應(yīng)該分的資源的總和)之間的比值,選擇一個(gè)該比值最小的隊(duì)列
4.其次,根據(jù)作業(yè)的優(yōu)先級(jí)和提交時(shí)間順序,同時(shí)考慮用戶資源量限制和內(nèi)存限制對(duì)隊(duì)列內(nèi)任務(wù)排序
5.三個(gè)隊(duì)列同時(shí)按照任務(wù)的先后順序依次執(zhí)行,比如,job1,job21和job31分別排在隊(duì)列最前面,是最先運(yùn)行,也是同時(shí)運(yùn)行
該調(diào)度默認(rèn)情況下不支持優(yōu)先級(jí),但是可以在配置文件中開啟此選項(xiàng),如果支持優(yōu)先級(jí),調(diào)度算法就是帶有優(yōu)先級(jí)的FIFO。
不支持優(yōu)先級(jí)搶占,一旦一個(gè)作業(yè)開始執(zhí)行,在執(zhí)行完之前它的資源不會(huì)被高優(yōu)先級(jí)作業(yè)所搶占。
對(duì)隊(duì)列中同一用戶提交的作業(yè)能夠獲得的資源百分比進(jìn)行了限制以使同屬于一用戶的作業(yè)不能出現(xiàn)獨(dú)占資源的情況。即同一用戶在不同隊(duì)列所能使用的資源的百分比
?
? 圖 4.3 fair scheduler調(diào)度器
1.支持多隊(duì)列多用戶,每個(gè)隊(duì)列中的資源量可以配置,同一個(gè)隊(duì)列中的作業(yè)公平共享隊(duì)列中所有資源
2.比如有三個(gè)隊(duì)列A,B,C.每個(gè)隊(duì)列中的job按照優(yōu)先級(jí)分配資源,優(yōu)先級(jí)越高分配的資源越多,但是每個(gè)job都分配到資源以確保公平。在資源有限的情況下,每個(gè)job理想情況下,獲得的計(jì)算資源與實(shí)際獲得的計(jì)算資源存在一種差距,這個(gè)差距叫做缺額。同一個(gè)隊(duì)列,job的資源缺額越大,越先獲得的資源優(yōu)先執(zhí)行,作業(yè)是按照缺額的高低來先后執(zhí)行的,而且可以看到上圖有多個(gè)作業(yè)同時(shí)運(yùn)行
推測(cè)執(zhí)行(Speculative Execution)是指在集群環(huán)境下運(yùn)行MapReduce,可能是程序Bug,負(fù)載不均或者其他的一些問題,導(dǎo)致在一個(gè)JOB下的多個(gè)TASK速度不一致,比如有的任務(wù)已經(jīng)完成,但是有些任務(wù)可能只跑了10%,根據(jù)木桶原理,這些任務(wù)將成為整個(gè)JOB的短板,如果集群?jiǎn)?dòng)了推測(cè)執(zhí)行,這時(shí)為了最大限度的提高短板,Hadoop會(huì)為該task啟動(dòng)備份任務(wù),讓speculative task與原始task同時(shí)處理一份數(shù)據(jù),哪個(gè)先運(yùn)行完,則將誰的結(jié)果作為最終結(jié)果,并且在運(yùn)行完成后Kill掉另外一個(gè)任務(wù)。
發(fā)現(xiàn)拖后腿的任務(wù),比如某個(gè)任務(wù)運(yùn)行速度遠(yuǎn)慢于任務(wù)平均速度。為拖后腿任務(wù)啟動(dòng)一個(gè)備份任務(wù),同時(shí)運(yùn)行。誰先運(yùn)行完,則采用誰的結(jié)果。并且運(yùn)行完之后,會(huì)將未執(zhí)行完成的任務(wù)直接kill掉。
1)每個(gè)task只能有一個(gè)備份任務(wù);
2)當(dāng)前job已完成的task必須不小于5%;
3)不能啟用推測(cè)執(zhí)行的情況:任務(wù)間存在嚴(yán)重負(fù)載傾斜;特殊任務(wù),比如任務(wù)向數(shù)據(jù)庫中寫入數(shù)據(jù);
4)開啟推測(cè)執(zhí)行參數(shù)設(shè)置,mapred-site.xml中默認(rèn)是打開的
開啟map任務(wù)的推測(cè)執(zhí)行
<property>
<name>mapreduce.map.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some map tasks may be executed in parallel.</description>
</property>
開啟reduce任務(wù)的推測(cè)執(zhí)行
<property>
<name>mapreduce.reduce.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some reduce tasks
may be executed in parallel.</description>
</property>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。