這篇文章主要講解了“YARN Capacity Scheduler怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“YARN Capacity Scheduler怎么實(shí)現(xiàn)”吧!
創(chuàng)新互聯(lián)是一家成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),提供網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,建網(wǎng)站,按需網(wǎng)站建設(shè),網(wǎng)站開發(fā)公司,自2013年起是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價(jià)值為核心業(yè)務(wù),全程參與項(xiàng)目的網(wǎng)站策劃設(shè)計(jì)制作,前端開發(fā),后臺(tái)程序制作以及后期項(xiàng)目運(yùn)營(yíng)并提出專業(yè)建議和思路。
以隊(duì)列為單位劃分資源,每個(gè)隊(duì)列可設(shè)定一定比例的資源最低保證和使用上限,同時(shí),每個(gè)用戶也可設(shè)定一定的資源使用上限以防止資源濫用。而當(dāng)一個(gè)隊(duì)列的資源有剩余時(shí),可暫時(shí)將剩余資源共享給其他隊(duì)列??傊?,Capacity Scheduler主要有以下幾個(gè)特點(diǎn):
容量保證:管理員可為每個(gè)隊(duì)列設(shè)置資源最低保證和資源使用上限,而所有提交到該隊(duì)列的應(yīng)用程序共享這些資源
靈活性:如果一個(gè)隊(duì)列中的資源有剩余,可以暫時(shí)共享給那些需要資源的隊(duì)列,而一旦該隊(duì)列有新的應(yīng)用程序提交,則其他隊(duì)列釋放的資源會(huì)歸還給該隊(duì)列
多重租賃:支持多用戶共享集群和多應(yīng)用程序同時(shí)運(yùn)行。為防止單個(gè)應(yīng)用程序、用戶或隊(duì)列獨(dú)占集群中的資源,管理員可為之增加多重約束(比如單個(gè)應(yīng)用程序同時(shí)運(yùn)行的任務(wù)數(shù)等)
安全保證:每個(gè)隊(duì)列有嚴(yán)格的ACL列表規(guī)定它的訪問用戶,每個(gè)用戶可指定哪些用戶允許查看自己應(yīng)用程序的運(yùn)行狀態(tài)或者控制應(yīng)用程序(比如殺死應(yīng)用程序)。此外,管理員可指定隊(duì)列管理員和集群系統(tǒng)管理員
動(dòng)態(tài)更新配置文件:管理員可根據(jù)需要?jiǎng)討B(tài)修改各種配置參數(shù),以實(shí)現(xiàn)在線集群管理
Capacity Scheduler有自己的配置文件,即存放在conf目錄下的capacity-scheduler.xml
在Capacity Scheduler的配置文件中,隊(duì)列queueX的參數(shù)Y的配置名稱為yarn.scheduler.capacity.queueX.Y
資源分配相關(guān)參數(shù):
capacity:隊(duì)列的最小資源容量(百分比)。注意,所有隊(duì)列的容量之和應(yīng)小于100
maximum-capacity:隊(duì)列的資源使用上限
minimum-user-limit-percent:每個(gè)用戶最低資源保障(百分比)
user-limit-factor:每個(gè)用戶最多可使用的資源量(百分比)
限制應(yīng)用程序數(shù)目的相關(guān)參數(shù):
maximum-applications:集群或者隊(duì)列中處于等待和運(yùn)行狀態(tài)的應(yīng)用程序數(shù)目上限,這是一個(gè)強(qiáng)限制項(xiàng),一旦集群中應(yīng)用程序數(shù)目超過該上限,后續(xù)提交的應(yīng)用程序?qū)⒈痪芙^。默認(rèn)值為10000。Hadoop允許從集群和隊(duì)列兩個(gè)方面該值,其中,集群的總體數(shù)目上限可通過參數(shù)yarn.scheduler.capacity.maximum-applications
設(shè)置,默認(rèn)為10000,而單個(gè)隊(duì)列可通過參數(shù)yarn.scheduler.capacity.
設(shè)置適合自己的值
maximum-am-resource-percent:集群中用于運(yùn)行應(yīng)用程序ApplicationMaster的資源比例上限,該參數(shù)通常用于限制處于活動(dòng)狀態(tài)的應(yīng)用程序數(shù)目。所有隊(duì)列的ApplicationMaster資源比例上限可通過參數(shù)yarn.scheduler.capacity.maximum-am-resource-percent
設(shè)置,而單個(gè)隊(duì)列可通過參數(shù)yarn.scheduler.capacity.
設(shè)置適合自己的值
隊(duì)列訪問權(quán)限控制
state:隊(duì)列狀態(tài),可以為STOPPED
或者RUNNING
。如果一個(gè)隊(duì)列處于STOPPED狀態(tài),用戶不可以將應(yīng)用程序提交到該隊(duì)列或者它的子隊(duì)列中。類似的,如果root隊(duì)列處于STOPPED狀態(tài),則用戶不可以向集群提交應(yīng)用程序,但正在運(yùn)行的應(yīng)用程序可以正常運(yùn)行結(jié)束,以便隊(duì)列可以優(yōu)雅地退出
acl_submit_application:限定哪些用戶/用戶組可向給定隊(duì)列中提交應(yīng)用程序。該屬性具有繼承性,即如果一個(gè)用戶可以向某個(gè)隊(duì)列提交應(yīng)用程序,則它可以向它所有子隊(duì)列中提交應(yīng)用程序
acl_administer_queue:為隊(duì)列指定一個(gè)管理員,該管理員可控制該隊(duì)列的所有應(yīng)用程序,比如殺死任意一個(gè)應(yīng)用程序等。同樣,該屬性具有繼承性,如果一個(gè)用戶可以向某個(gè)隊(duì)列中提交應(yīng)用程序,則它可以向它的所有子隊(duì)列中提交應(yīng)用程序
當(dāng)管理員需動(dòng)態(tài)修改隊(duì)列資源配置時(shí),可修改配置文件conf/capacity-scheduler.xml,然后運(yùn)行“yarn rmadmin -refreshQueues
”
當(dāng)前Capacity Scheduler不允許管理員動(dòng)態(tài)減少隊(duì)列數(shù)目,且更新的配置參數(shù)值應(yīng)是合法值,否則會(huì)導(dǎo)致配置文件加載失敗
應(yīng)用程序被提交到ResourceManager之后,ResourceManager會(huì)向Capacity Scheduler發(fā)送一個(gè)SchedulerEventType.APP_ADDED事件,Capacity Scheduler收到該事件后,將為應(yīng)用程序創(chuàng)建一個(gè)FiCaSchedulerApp對(duì)象跟蹤和維護(hù)該應(yīng)用程序的運(yùn)行時(shí)信息,同時(shí)將應(yīng)用程序提交到對(duì)應(yīng)的葉子隊(duì)列中,葉子隊(duì)列會(huì)對(duì)應(yīng)用程序進(jìn)行一系列合法性檢查。只有通過這些合法性檢查,應(yīng)用程序才算提交成功,這些合法性包括以下幾個(gè)方面:
應(yīng)用程序所屬用戶擁有該葉子隊(duì)列的應(yīng)用程序提交權(quán)限
隊(duì)列及其父隊(duì)列當(dāng)前處于RUNNING狀態(tài)(遞歸檢查)
隊(duì)列當(dāng)前已提交的應(yīng)用程序數(shù)目未達(dá)到管理員設(shè)定的上限
應(yīng)用程序所屬用戶提交的應(yīng)用程序數(shù)目未超過管理員設(shè)定的上限
當(dāng)ResourceManager收到來自NodeManager發(fā)送的心跳信息后,將向Capacity Scheduler發(fā)送一個(gè)SchedulerEventType.NODE_UPDATE事件,Capacity Scheduler收到該事件后,會(huì)依次進(jìn)行以下操作:
處理心跳信息:NodeManager發(fā)送的心跳信息中有兩類信息需資源調(diào)度器處理,一類是最新啟動(dòng)的Container,另一類是運(yùn)行完成的Container,具體如下:
對(duì)于最新啟動(dòng)的Container,資源調(diào)度器需向ResourceManager發(fā)送一個(gè)RMContainerEventType.LAUNCHED,進(jìn)而將該Container從超時(shí)監(jiān)控隊(duì)列中刪除。當(dāng)資源調(diào)度器為ApplicationMaster分配一個(gè)Container后,為了防止ApplicationMaster長(zhǎng)時(shí)間不使用該Container造成資源浪費(fèi),它會(huì)將該Container加入一個(gè)超時(shí)監(jiān)控隊(duì)列中。如果一段時(shí)間內(nèi),該隊(duì)列中的Container仍未被使用,則資源調(diào)度器會(huì)回收該Container
對(duì)于運(yùn)行完成的Container,資源管理器將回收它使用的資源,以便接下來對(duì)這些資源進(jìn)行再分配
處理完以上兩類信息后,Capacity Scheduler將節(jié)點(diǎn)上的空閑資源分配給應(yīng)用程序
資源分配
1. Container主要包含5類信息:
優(yōu)先級(jí)
期望資源所在節(jié)點(diǎn)
資源量
Container數(shù)目
是否松弛本地性(即是否在沒有滿足節(jié)點(diǎn)本地性資源時(shí),選擇機(jī)架本地性資源)
2. 資源調(diào)度器收到資源申請(qǐng)后,將暫時(shí)將這些數(shù)據(jù)請(qǐng)求存放到一個(gè)數(shù)據(jù)結(jié)構(gòu)中,以等待空閑資源出現(xiàn)后為其分配合適的資源
3. 當(dāng)一個(gè)節(jié)點(diǎn)上有空閑資源時(shí),它會(huì)依次選擇隊(duì)列、應(yīng)用程序和container(請(qǐng)求)使用該資源
步驟1:選擇隊(duì)列
從根隊(duì)列開始,按照它的子隊(duì)列資源使用率由小到大依次遍歷各個(gè)子隊(duì)列。如果子隊(duì)列為葉子隊(duì)列,則依次按照步驟2和步驟3中的方法在隊(duì)列中選出一個(gè)Container(請(qǐng)求),否則以該子隊(duì)列為根隊(duì)列,重復(fù)以上過程,直到找到一個(gè)合適的隊(duì)列并退出
注意:上述“隊(duì)列資源使用率”計(jì)算方法為用已經(jīng)使用的資源量除以最小隊(duì)列資源容量(由管理員配置)。對(duì)于非葉子隊(duì)列,它的已使用資源量是各個(gè)子隊(duì)列已使用資源量之和
步驟2:選擇應(yīng)用程序
在步驟1中選中一個(gè)葉子隊(duì)列后,Capacity Scheduler按照提交時(shí)間對(duì)子隊(duì)列中的應(yīng)用程序進(jìn)行排序(實(shí)際排序時(shí)用的是Applition ID,提交時(shí)間越早的應(yīng)用程序,Application ID越?。x擇最早提交的 Application 分配資源
步驟3:選擇Container(請(qǐng)求)
對(duì)于同一個(gè)應(yīng)用程序,它請(qǐng)求的Container可能是多樣化的,涉及不同的優(yōu)先級(jí)、節(jié)點(diǎn)、資源量和數(shù)量。當(dāng)選中一個(gè)應(yīng)用程序后,Capacity Scheduler將嘗試優(yōu)先滿足優(yōu)先級(jí)高的Container。對(duì)于同一類優(yōu)先級(jí),優(yōu)先選擇滿足本地性的Container,它會(huì)依次選擇node local、rack local和no local的Container
4. Capacity Scheduler有兩種比較器用以比較兩個(gè)資源的大?。ū热绫容^用戶當(dāng)前使用的資源量是否超過了設(shè)置的上限資源量),默認(rèn)是DefaultResourceCalculator,它只考慮內(nèi)存資源。另外一種是DominantResourceCalculator,它采用了DRF比較算法,同時(shí)考慮內(nèi)存和CPU兩種資源。管理員可通過參數(shù)yarn.scheduler.capacity.resource-calculator
設(shè)置資源比較器
5. 其他事件處理
APP_REMOVED:在多種情況下Capacity Scheduler將收到該事件,包括應(yīng)用程序正常結(jié)束、應(yīng)用程序被殺死等。Capacity Scheduler收到該事件后,首先會(huì)向所有未運(yùn)行完成的Container發(fā)送一個(gè)RMContainerEventType.KILL事件,以釋放正在使用的Container;然后才會(huì)將應(yīng)用程序相關(guān)數(shù)據(jù)結(jié)構(gòu)從內(nèi)存中移除
NODE_ADDED:當(dāng)集群中動(dòng)態(tài)加入一個(gè)節(jié)點(diǎn)時(shí)(比如管理員動(dòng)態(tài)擴(kuò)充集群規(guī)?;蛘吖?jié)點(diǎn)斷開后又復(fù)活等),Capacity Scheduler將收到該事件。Capacity Scheduler收到該事件后,只需在相應(yīng)數(shù)據(jù)結(jié)構(gòu)中記錄NodeManager信息并增加系統(tǒng)總資源量即可
NODE_REMOVED:當(dāng)集群中動(dòng)態(tài)移除一個(gè)節(jié)點(diǎn)時(shí)(比如管理員動(dòng)態(tài)移除節(jié)點(diǎn)或者節(jié)點(diǎn)在一定事件內(nèi)未匯報(bào)心跳而被ResourceManager移除集群),Capacity Scheduler將收到該事件。Capacity Scheduler收到該事件后,除了移除NodeManager信息并減少系統(tǒng)總資源外,還需向所有正運(yùn)行的Container發(fā)送一個(gè)RMContainerEventType.KILL事件,以清空相關(guān)信息
CONTAINER_EXPIRED:當(dāng)Capacity Scheduler將一個(gè)Container分配給ApplicationMaster后,ApplicationMaster在一定時(shí)間內(nèi)必須使用該Container,否則ResourceManager將進(jìn)行強(qiáng)制回收,此時(shí)會(huì)觸發(fā)一個(gè)CONTAINER_EXPIRED事件
感謝各位的閱讀,以上就是“YARN Capacity Scheduler怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)YARN Capacity Scheduler怎么實(shí)現(xiàn)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!