溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hadoop Yarn調(diào)度器的選擇和使用

發(fā)布時(shí)間:2020-07-10 22:04:29 來源:網(wǎng)絡(luò) 閱讀:751 作者:跨界的聚能 欄目:大數(shù)據(jù)

一、引言

Yarn在Hadoop的生態(tài)系統(tǒng)中擔(dān)任了資源管理和任務(wù)調(diào)度的角色。在討論其構(gòu)造器之前先簡單了解一下Yarn的架構(gòu)。

Hadoop Yarn調(diào)度器的選擇和使用

上圖是Yarn的基本架構(gòu),其中ResourceManager是整個(gè)架構(gòu)的核心組件,它負(fù)責(zé)整個(gè)集群中包括內(nèi)存、CPU等資源的管理;ApplicationMaster負(fù)責(zé)應(yīng)用程序在整個(gè)生命周期的任務(wù)調(diào)度;NodeManager負(fù)責(zé)本節(jié)點(diǎn)上資源的供給和隔離;Container可以抽象的看成是運(yùn)行任務(wù)的一個(gè)容器。本文討論的調(diào)度器是在ResourceManager組建中進(jìn)行調(diào)度的,接下來就一起研究一下包括FIFO調(diào)度器、Capacity調(diào)度器、Fair調(diào)度器在內(nèi)的三個(gè)調(diào)度器。

二、FIFO調(diào)度器

Hadoop Yarn調(diào)度器的選擇和使用

上圖為FIFO調(diào)度器的執(zhí)行過程示意圖。FIFO調(diào)度器也就是平時(shí)所說的先進(jìn)先出(First In First Out)調(diào)度器。FIFO調(diào)度器是Hadoop最早應(yīng)用的一種調(diào)度策略,可以簡單的將其理解為一個(gè)Java隊(duì)列,它的含義在于集群中同時(shí)只能有一個(gè)作業(yè)在運(yùn)行。將所有的Application按照提交時(shí)候的順序來執(zhí)行,只有當(dāng)上一個(gè)Job執(zhí)行完成之后后面的Job才會(huì)按照隊(duì)列的順序依次被執(zhí)行。FIFO調(diào)度器以集群資源獨(dú)占的方式來運(yùn)行作業(yè),這樣的好處是一個(gè)作業(yè)可以充分利用所有的集群資源,但是對于運(yùn)行時(shí)間短,重要性高或者交互式查詢類的MR作業(yè)就要等待排在序列前的作業(yè)完成才能被執(zhí)行,這也就導(dǎo)致了如果有一個(gè)非常大的Job在運(yùn)行,那么后面的作業(yè)將會(huì)被阻塞。因此,雖然單一的FIFO調(diào)度實(shí)現(xiàn)簡單,但是對于很多實(shí)際的場景并不能滿足要求。這也就催發(fā)了Capacity調(diào)度器和Fair調(diào)度器的出現(xiàn)。

三、Capacity調(diào)度器

Hadoop Yarn調(diào)度器的選擇和使用

上圖是Capacity調(diào)度器的執(zhí)行過程示意圖。Capacity調(diào)度器也就是日常說的容器調(diào)度器??梢詫⑺斫獬梢粋€(gè)個(gè)的資源隊(duì)列。這個(gè)資源隊(duì)列是用戶自己去分配的。例如因?yàn)楣ぷ魉枰颜麄€(gè)集群分成了AB兩個(gè)隊(duì)列,A隊(duì)列下面還可以繼續(xù)分,比如將A隊(duì)列再分為1和2兩個(gè)子隊(duì)列。那么隊(duì)列的分配就可以參考下面的樹形結(jié)構(gòu):
—A[60%]
|—A.1[40%]
|—A.2[60%]
—B[40%]
上述的樹形結(jié)構(gòu)可以理解為A隊(duì)列占用整個(gè)資源的60%,B隊(duì)列占用整個(gè)資源的40%。A隊(duì)列里面又分了兩個(gè)子隊(duì)列,A.1占據(jù)40%,A.2占據(jù)60%,也就是說此時(shí)A.1和A.2分別占用A隊(duì)列的40%和60%的資源。雖然此時(shí)已經(jīng)具體分配了集群的資源,但是并不是說A提交了任務(wù)之后只能使用它被分配到的60%的資源,而B隊(duì)列的40%的資源就處于空閑。只要是其它隊(duì)列中的資源處于空閑狀態(tài),那么有任務(wù)提交的隊(duì)列可以使用空閑隊(duì)列所分配到的資源,使用的多少是依據(jù)配來決定。參數(shù)的配置會(huì)在后文中提到。

在這里還是要推薦下我自己建的大數(shù)據(jù)學(xué)習(xí)交流群:784557197,群里都是學(xué)大數(shù)據(jù)開發(fā)的,如果你正在學(xué)習(xí)大數(shù)據(jù) ,小編歡迎你加入,大家都是軟件開發(fā)黨,不定期分享干貨(只有大數(shù)據(jù)軟件開發(fā)相關(guān)的),包括我自己整理的一份2018最新的大數(shù)據(jù)進(jìn)階資料和高級開發(fā)教程,歡迎進(jìn)階中和進(jìn)想深入大數(shù)據(jù)的小伙伴加入。

Capacity調(diào)度器具有以下的幾個(gè)特性:

  • 層次化的隊(duì)列設(shè)計(jì),這種層次化的隊(duì)列設(shè)計(jì)保證了子隊(duì)列可以使用父隊(duì)列設(shè)置的全部資源。這樣通過層次化的管理,更容易合理分配和限制資源的使用。
  • 容量保證,隊(duì)列上都會(huì)設(shè)置一個(gè)資源的占比,這樣可以保證每個(gè)隊(duì)列都不會(huì)占用整個(gè)集群的資源。
  • 安全,每個(gè)隊(duì)列又嚴(yán)格的訪問控制。用戶只能向自己的隊(duì)列里面提交任務(wù),而且不能修改或者訪問其他隊(duì)列的任務(wù)。
  • 彈性分配,空閑的資源可以被分配給任何隊(duì)列。當(dāng)多個(gè)隊(duì)列出現(xiàn)爭用的時(shí)候,則會(huì)按照比例進(jìn)行平衡。
  • 多租戶租用,通過隊(duì)列的容量限制,多個(gè)用戶就可以共享同一個(gè)集群,同事保證每個(gè)隊(duì)列分配到自己的容量,提高利用率。
  • 操作性,Yarn支持動(dòng)態(tài)修改調(diào)整容量、權(quán)限等的分配,可以在運(yùn)行時(shí)直接修改。還提供給管理員界面,來顯示當(dāng)前的隊(duì)列狀況。管理員可以在運(yùn)行時(shí),添加一個(gè)隊(duì)列;但是不能刪除一個(gè)隊(duì)列。管理員還可以在運(yùn)行時(shí)暫停某個(gè)隊(duì)列,這樣可以保證當(dāng)前的隊(duì)列在執(zhí)行過程中,集群不會(huì)接收其他的任務(wù)。如果一個(gè)隊(duì)列被設(shè)置成了stopped,那么就不能向他或者子隊(duì)列上提交任務(wù)了。
  • 基于資源的調(diào)度,協(xié)調(diào)不同資源需求的應(yīng)用程序,比如內(nèi)存、CPU、磁盤等等。

相關(guān)參數(shù)的配置:

(1)capacity:隊(duì)列的資源容量(百分比)。 當(dāng)系統(tǒng)非常繁忙時(shí),應(yīng)保證每個(gè)隊(duì)列的容量得到滿足,而如果每個(gè)隊(duì)列應(yīng)用程序較少,可將剩余資源共享給其他隊(duì)列。注意,所有隊(duì)列的容量之和應(yīng)小于100。
(2)maximum-capacity:隊(duì)列的資源使用上限(百分比)。由于存在資源共享,因此一個(gè)隊(duì)列使用的資源量可能超過其容量,而最多使用資源量可通過該參數(shù)限制。(這也是前文提到的關(guān)于有任務(wù)運(yùn)行的隊(duì)列可以占用的資源的最大百分比)
(3)user-limit-factor:每個(gè)用戶最多可使用的資源量(百分比)。比如,假設(shè)該值為30,則任何時(shí)刻,每個(gè)用戶使用的資源量不能超過該隊(duì)列容量的30%。
(4)maximum-applications :集群或者隊(duì)列中同時(shí)處于等待和運(yùn)行狀態(tài)的應(yīng)用程序數(shù)目上限,這是一個(gè)強(qiáng)限制,一旦集群中應(yīng)用程序數(shù)目超過該上限,后續(xù)提交的應(yīng)用程序?qū)⒈痪芙^,默認(rèn)值為 10000。所有隊(duì)列的數(shù)目上限可通過參數(shù)yarn.scheduler.capacity.maximum-applications設(shè)置(可看做默認(rèn)值),而單個(gè)隊(duì)列可通過參數(shù)yarn.scheduler.capacity..maximum- applications設(shè)置適合自己的值。
(5)maximum-am-resource-percent:集群中用于運(yùn)行應(yīng)用程序 ApplicationMaster的資源比例上限,該參數(shù)通常用于限制處于活動(dòng)狀態(tài)的應(yīng)用程序數(shù)目。該參數(shù)類型為浮點(diǎn)型,默認(rèn)是0.1,表示10%。所有隊(duì)列的ApplicationMaster資源比例上限可通過參數(shù)yarn.scheduler.capacity. maximum-am-resource-percent設(shè)置(可看做默認(rèn)值),而單個(gè)隊(duì)列可通過參數(shù) yarn.scheduler.capacity.. maximum-am-resource-percent設(shè)置適合自己的值。
(6)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)雅地退出。
(7)acl_submit_applications:限定哪些Linux用戶/用戶組可向給定隊(duì)列中提交應(yīng)用程序。需要注意的是,該屬性具有繼承性,即如果一個(gè)用戶可以向某個(gè)隊(duì)列中提交應(yīng)用程序,則它可以向它的所有子隊(duì)列中提交應(yīng)用程序。配置該屬性時(shí),用戶之間或用戶組之間用“,”分割,用戶和用戶組之間用空格分割,比如“user1, user2 group1,group2”。
(8)acl_administer_queue:為隊(duì)列指定一個(gè)管理員,該管理員可控制該隊(duì)列的所有應(yīng)用程序,比如殺死任意一個(gè)應(yīng)用程序等。同樣,該屬性具有繼承性,如果一個(gè)用戶可以向某個(gè)隊(duì)列中提交應(yīng)用程序,則它可以向它的所有子隊(duì)列中提交應(yīng)用程序。

四、Fair調(diào)度器

Hadoop Yarn調(diào)度器的選擇和使用

上圖是Fair調(diào)度器在一個(gè)隊(duì)列中的執(zhí)行過程示意圖。Fair調(diào)度器也就是日常說的公平調(diào)度器。Fair調(diào)度器是一個(gè)隊(duì)列資源分配方式,在整個(gè)時(shí)間線上,所有的Job平均的獲取資源。默認(rèn)情況下,F(xiàn)air調(diào)度器只是對內(nèi)存資源做公平的調(diào)度和分配。當(dāng)集群中只有一個(gè)任務(wù)在運(yùn)行時(shí),那么此任務(wù)會(huì)占用整個(gè)集群的資源。當(dāng)其他的任務(wù)提交后,那些釋放的資源將會(huì)被分配給新的Job,所以每個(gè)任務(wù)最終都能獲取幾乎一樣多的資源。
Hadoop Yarn調(diào)度器的選擇和使用

公平調(diào)度器也可以在多個(gè)隊(duì)列間工作,如上圖所示,例如有兩個(gè)用戶A和B,他們分別擁有一個(gè)隊(duì)列。當(dāng)A啟動(dòng)一個(gè)Job而B沒有任務(wù)提交時(shí),A會(huì)獲得全部集群資源;當(dāng)B啟動(dòng)一個(gè)Job后,A的任務(wù)會(huì)繼續(xù)運(yùn)行,不過隊(duì)列A會(huì)慢慢釋放它的一些資源,一會(huì)兒之后兩個(gè)任務(wù)會(huì)各自獲得一半的集群資源。如果此時(shí)B再啟動(dòng)第二個(gè)Job并且其它任務(wù)也還在運(yùn)行時(shí),那么它將會(huì)和B隊(duì)列中的的第一個(gè)Job共享隊(duì)列B的資源,也就是隊(duì)列B的兩個(gè)Job會(huì)分別使用集群四分之一的資源,而隊(duì)列A的Job仍然會(huì)使用集群一半的資源,結(jié)果就是集群的資源最終在兩個(gè)用戶之間平等的共享?! ?/p>

相關(guān)參數(shù)的配置:

(1)yarn.scheduler.fair.allocation.file: “allocation”文件的位置,“allocation”文件是一個(gè)用來描述queue以及它們的屬性的配置文件。這個(gè)文件必須為格式嚴(yán)格的xml文件。如果為相對路徑,那么將會(huì)在classpath下查找此文件(conf目錄下)。默認(rèn)值為“fair-scheduler.xml”。
(2)yarn.scheduler.fair.user-as-default-queue:是否將與allocation有關(guān)的username作為默認(rèn)的queue name,當(dāng)queue name沒有指定的時(shí)候。如果設(shè)置成false(且沒有指定queue name) 或者沒有設(shè)定,所有的jobs將共享“default” queue。默認(rèn)值為true。
(3)yarn.scheduler.fair.preemption:是否使用“preemption”(優(yōu)先權(quán),搶占),默認(rèn)為fasle,在此版本中此功能為測試性的。
(4)yarn.scheduler.fair.assignmultiple:是在允許在一個(gè)心跳中,發(fā)送多個(gè)container分配信息。默認(rèn)值為false。
(5)yarn.scheduler.fair.max.assign:如果assignmultuple為true,那么在一次心跳中,最多發(fā)送分配container的個(gè)數(shù)。默認(rèn)為-1,無限制。
(6)yarn.scheduler.fair.locality.threshold.node:一個(gè)float值,在0~1之間,表示在等待獲取滿足node-local條件的containers時(shí),最多放棄不滿足node-local的container的機(jī)會(huì)次數(shù),放棄的nodes個(gè)數(shù)為集群的大小的比例。默認(rèn)值為-1.0表示不放棄任何調(diào)度的機(jī)會(huì)。
(7)yarn.scheduler.fair.locality.threashod.rack:同上,滿足rack-local。
(8)yarn.scheduler.fair.sizebaseweight:是否根據(jù)application的大小(Job的個(gè)數(shù))作為權(quán)重。默認(rèn)為false,如果為true,那么復(fù)雜的application將獲取更多的資源。

五、總結(jié)

如果業(yè)務(wù)邏輯比較簡單或者剛接觸Hadoop的時(shí)候建議使用FIFO調(diào)度器;如果需要控制部分應(yīng)用的優(yōu)先級同時(shí)又想要充分利用集群資源的情況下,建議使用Capacity調(diào)度器;如果想要多用戶或者多隊(duì)列公平的共享集群資源,那么就選用Fair調(diào)度器。希望大家能夠根據(jù)業(yè)務(wù)所需選擇合適的調(diào)度器。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI