本文轉載自微信公衆号「Java大(dà)數據與數據倉庫」,作者老董。轉載本文請聯系Java大(dà)數據與數據倉庫公衆号。
目錄
1. Yarn調度器介紹
FIFO(先進先出調度器)
Capacity(容量調度器)
Fair(公平調度器)
Fair與Capacity區(qū)别
2.Yarn調度器配置
Fair
Capacity配置(默認配置)
FIFO
理(lǐ)想情況下(xià),我們應用(yòng)對(duì)Yarn資源的(de)請求應該立刻得(de)到滿足,但現實情況資源往往是有限的(de),特别是在一個(gè)很繁忙的(de)集群,一個(gè)應用(yòng)資源的(de)請求經常需要等待一段時(shí)間才能的(de)到相應的(de)資源。在Yarn中,負責給應用(yòng)分(fēn)配資源的(de)就是Scheduler。其實調度本身就是一個(gè)難題,很難找到一個(gè)完美(měi)的(de)策略可(kě)以解決所有的(de)應用(yòng)場(chǎng)景。爲此,Yarn提供了(le)多(duō)種調度器和(hé)可(kě)配置的(de)策略供我們選擇。YARN架構如下(xià):
ResourceManager(RM):負責對(duì)各NM上的(de)資源進行統一管理(lǐ)和(hé)調度,将AM分(fēn)配空閑的(de)Container運行并監控其運行狀态。對(duì)AM申請的(de)資源請求分(fēn)配相應的(de)空閑Container。主要由兩個(gè)組件構成:調度器(Scheduler)和(hé)應用(yòng)程序管理(lǐ)器(Applications Manager)。
調度器(Scheduler):調度器根據容量、隊列等限制條件(如每個(gè)隊列分(fēn)配一定的(de)資源,最多(duō)執行一定數量的(de)作業等),将系統中的(de)資源分(fēn)配給各個(gè)正在運行的(de)應用(yòng)程序。調度器僅根據各個(gè)應用(yòng)程序的(de)資源需求進行資源分(fēn)配,而資源分(fēn)配單位是Container,從而限定每個(gè)任務使用(yòng)的(de)資源量。Scheduler不負責監控或者跟蹤應用(yòng)程序的(de)狀态,也(yě)不負責任務因爲各種原因而需要的(de)重啓(由ApplicationMaster負責)。總之,調度器根據應用(yòng)程序的(de)資源要求,以及集群機器的(de)資源情況,爲用(yòng)程序分(fēn)配封裝在Container中的(de)資源。調度器是可(kě)插拔的(de),例如CapacityScheduler、FairScheduler。(PS:在實際應用(yòng)中,隻需要簡單配置即可(kě))
應用(yòng)程序管理(lǐ)器(Application Manager):應用(yòng)程序管理(lǐ)器負責管理(lǐ)整個(gè)系統中所有應用(yòng)程序,包括應用(yòng)程序提交、與調度器協商資源以啓動AM、監控AM運行狀态并在失敗時(shí)重新啓動等,跟蹤分(fēn)給的(de)Container的(de)進度、狀态也(yě)是其職責。ApplicationMaster是應用(yòng)框架,它負責向
ResourceManager協調資源,并且與NodeManager協同工作完成Task的(de)執行和(hé)監控。MapReduce就是原生支持的(de)一種框架,可(kě)以在YARN上運行Mapreduce作業。有很多(duō)分(fēn)布式應用(yòng)都開發了(le)對(duì)應的(de)應用(yòng)程序框架,用(yòng)于在YARN上運行任務,例如Spark,Storm等。如果需要,我們也(yě)可(kě)以自己寫一個(gè)符合規範的(de)YARN application。
NodeManager(NM):NM是每個(gè)節點上的(de)資源和(hé)任務管理(lǐ)器。它會定時(shí)地向RM彙報本節點上的(de)資源使用(yòng)情況和(hé)各個(gè)Container的(de)運行狀态;同時(shí)會接收并處理(lǐ)來(lái)自AM的(de)Container 啓動/停止等請求。ApplicationMaster(AM):用(yòng)戶提交的(de)應用(yòng)程序均包含一個(gè)AM,負責應用(yòng)的(de)監控,跟蹤應用(yòng)執行狀态,重啓失敗任務等。
Container:是YARN中的(de)資源抽象,它封裝了(le)某個(gè)節點上的(de)多(duō)維度資源,如内存、CPU、磁盤、網絡等,當AM向RM申請資源時(shí),RM爲AM返回的(de)資源便是用(yòng)Container 表示的(de)。YARN會爲每個(gè)任務分(fēn)配一個(gè)Container且該任務隻能使用(yòng)該Container中描述的(de)資源。
1. Yarn調度器介紹
1.1. FIFO (先進先出調度器)
FIFO Scheduler把應用(yòng)按提交的(de)順序排成一個(gè)隊列,這(zhè)是一個(gè)先進先出隊列,在進行資源分(fēn)配的(de)時(shí)候,先給隊列中最頭上的(de)應用(yòng)進行分(fēn)配資源,待最頭上的(de)應用(yòng)需求滿足後再給下(xià)一個(gè)分(fēn)配,以此類推。FIFO Scheduler是最簡單也(yě)是最容易理(lǐ)解的(de)調度器,也(yě)不需要任何配置,但它并不适用(yòng)于共享集群。大(dà)的(de)應用(yòng)可(kě)能會占用(yòng)所有集群資源,這(zhè)就導緻其它應用(yòng)被阻塞。在共享集群中,更适合采用(yòng)Capacity Scheduler或Fair Scheduler,這(zhè)兩個(gè)調度器都允許大(dà)任務和(hé)小任務在提交的(de)同時(shí)獲得(de)一定的(de)系統資源。下(xià)面“Yarn調度器對(duì)比圖”展示了(le)這(zhè)幾個(gè)調度器的(de)區(qū)别,從圖中可(kě)以看出,在FIFO 調度器中,小任務會被大(dà)任務阻塞。
1.2. Capacity (容量調度器)
yarn-site.xml中默認配置的(de)資源調度器。而對(duì)于Capacity調度器,有一個(gè)專門的(de)隊列用(yòng)來(lái)運行小任務,但是爲小任務專門設置一個(gè)隊列會預先占用(yòng)一定的(de)集群資源,這(zhè)就導緻大(dà)任務的(de)執行時(shí)間會落後于使用(yòng)FIFO調度器時(shí)的(de)時(shí)間。用(yòng)這(zhè)個(gè)資源調度器,就可(kě)以配置yarn資源隊列,這(zhè)個(gè)後面後介紹用(yòng)到。
1.3. Fair (公平調度器)
Fair調度器的(de)設計目标是爲所有的(de)應用(yòng)分(fēn)配公平的(de)資源(對(duì)公平的(de)定義可(kě)以通(tōng)過參數來(lái)設置)。在上面的(de)“Yarn調度器對(duì)比圖”展示了(le)一個(gè)隊列中兩個(gè)應用(yòng)的(de)公平調度;當然,公平調度在也(yě)可(kě)以在多(duō)個(gè)隊列間工作。舉個(gè)例子,假設有兩個(gè)用(yòng)戶A和(hé)B,他(tā)們分(fēn)别擁有一個(gè)隊列。當A啓動一個(gè)job而B沒有任務時(shí),A會獲得(de)全部集群資源;當B啓動一個(gè)job後,A的(de)job會繼續運行,不過一會兒(ér)之後兩個(gè)任務會各自獲得(de)一半的(de)集群資源。如果此時(shí)B再啓動第二個(gè)job并且其它job還(hái)在運行,則它将會和(hé)B的(de)第一個(gè)job共享B這(zhè)個(gè)隊列的(de)資源,也(yě)就是B的(de)兩個(gè)job會用(yòng)于四分(fēn)之一的(de)集群資源,而A的(de)job仍然用(yòng)于集群一半的(de)資源,結果就是資源最終在兩個(gè)用(yòng)戶之間平等的(de)共享。在Fair調度器中,我們不需要預先占用(yòng)一定的(de)系統資源,Fair調度器會爲所有運行的(de)job動态的(de)調整系統資源。當第一個(gè)大(dà)job提交時(shí),隻有這(zhè)一個(gè)job在運行,此時(shí)它獲得(de)了(le)所有集群資源;當第二個(gè)小任務提交後,Fair調度器會分(fēn)配一半資源給這(zhè)個(gè)小任務,讓這(zhè)兩個(gè)任務公平的(de)共享集群資源。
a) 公平調度器,就是能夠共享整個(gè)集群的(de)資源
b) 不用(yòng)預先占用(yòng)資源,每一個(gè)作業都是共享的(de)
c) 每當提交一個(gè)作業的(de)時(shí)候,就會占用(yòng)整個(gè)資源。如果再提交一個(gè)作業,那麽第一個(gè)作業就會分(fēn)給第二個(gè)作業一部分(fēn)資源,第一個(gè)作業也(yě)就釋放一部分(fēn)資源。再提交其他(tā)的(de)作業時(shí),也(yě)同理(lǐ)。。。。也(yě)就是說每一個(gè)作業進來(lái),都有機會獲取資源。
1.4. Fair Scheduler與Capacity Scheduler區(qū)别
資源公平共享:在每個(gè)隊列中,Fair Scheduler可(kě)選擇按照(zhào)FIFO、Fair或DRF策略爲應用(yòng)程序分(fēn)配資源。Fair策略即平均分(fēn)配,默認情況下(xià),每個(gè)隊列采用(yòng)該方式分(fēn)配資源
支持資源搶占:當某個(gè)隊列中有剩餘資源時(shí),調度器會将這(zhè)些資源共享給其他(tā)隊列,而當該隊列中有新的(de)應用(yòng)程序提交時(shí),調度器要爲它回收資源。爲了(le)盡可(kě)能降低不必要的(de)計算(suàn)浪費,調度器采用(yòng)了(le)先等待再強制回收的(de)策略,即如果等待一段時(shí)間後尚有未歸還(hái)的(de)資源,則會進行資源搶占;從那些超額使用(yòng)資源的(de)隊列中殺死一部分(fēn)任務,進而釋放資源
負載均衡:Fair Scheduler提供了(le)一個(gè)基于任務數的(de)負載均衡機制,該機制盡可(kě)能将系統中的(de)任務均勻分(fēn)配到各個(gè)節點上。此外,用(yòng)戶也(yě)可(kě)以根據自己的(de)需求設計負載均衡機制
調度策略靈活配置:Fiar Scheduler允許管理(lǐ)員(yuán)爲每個(gè)隊列單獨設置調度策略(當前支持FIFO、Fair或DRF三種)
提高(gāo)小應用(yòng)程序響應時(shí)間:由于采用(yòng)了(le)最大(dà)最小公平算(suàn)法,小作業可(kě)以快(kuài)速獲取資源并運行完成
2.Yarn調度器配置
yarn資源調度器是在yarn-site.xml中配置。
2.1. Fair Scheduler
Fair Scheduler的(de)配置選項包括兩部分(fēn):
一部分(fēn)在yarn-site.xml中,主要用(yòng)于配置調度器級别的(de)參數
一部分(fēn)在一個(gè)自定義配置文件(默認是fair-scheduler.xml)中,主要用(yòng)于配置各個(gè)隊列的(de)資源量、權重等信息。
2.1.1 yarn-site.xml
yarn-site.xml介紹
<!– scheduler start –>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description>配置Yarn使用(yòng)的(de)調度器插件類名;Fair Scheduler對(duì)應的(de)是:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</description>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/etc/hadoop/conf/fair-scheduler.xml</value>
<description>配置資源池以及其屬性配額的(de)XML文件路徑(本地路徑)</description>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
<description>開啓資源搶占,default is True</description>
</property>
<property>
<name>yarn.scheduler.fair.user-as-default-queue</name>
<value>true</value>
<description>設置成true,當任務中未指定資源池的(de)時(shí)候,将以用(yòng)戶名作爲資源池名。這(zhè)個(gè)配置就實現了(le)根據用(yòng)戶名自動分(fēn)配資源池。default is True</description>
</property>
<property>
<name>yarn.scheduler.fair.allow-undeclared-pools</name>
<value>false</value>
<description>是否允許創建未定義的(de)資源池。如果設置成true,yarn将會自動創建任務中指定的(de)未定義過的(de)資源池。設置成false之後,任務中指定的(de)未定義的(de)資源池将無效,該任務會被分(fēn)配到default資源池中。,default is True</description>
</property>
<!– scheduler end –>
2.1.2 fair-scheduler.xml
假設在生産環境Yarn中,總共有四類用(yòng)戶需要使用(yòng)集群,production、spark、default、streaming。爲了(le)使其提交的(de)任務不受影(yǐng)響,我們在Yarn上規劃配置了(le)四個(gè)資源池,分(fēn)别爲production,spark,default,streaming。并根據實際業務情況,爲每個(gè)資源池分(fēn)配了(le)相應的(de)資源及優先級等,default用(yòng)于開發測試目的(de).
ResourceManager上fair-scheduler.xml配置如下(xià):
<?xml version="1.0"?>
<allocations>
<queue name="root">
<aclSubmitApps></aclSubmitApps>
<aclAdministerApps></aclAdministerApps>
<queue name="production">
<minResources>8192mb,8vcores</minResources>
<maxResources>419840mb,125vcores</maxResources>
<maxRunningApps>60</maxRunningApps>
<schedulingMode>fair</schedulingMode>
<weight>7.5</weight>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>production</aclAdministerApps>
</queue>
<queue name="spark">
<minResources>8192mb,8vcores</minResources>
<maxResources>376480mb,110vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<schedulingMode>fair</schedulingMode>
<weight>1</weight>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>spark</aclAdministerApps>
</queue>
<queue name="default">
<minResources>8192mb,8vcores</minResources>
<maxResources>202400mb,20vcores</maxResources>
<maxRunningApps>20</maxRunningApps>
<schedulingMode>FIFO</schedulingMode>
<weight>0.5</weight>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
</queue>
<queue name="streaming">
<minResources>8192mb,8vcores</minResources>
<maxResources>69120mb,16vcores</maxResources>
<maxRunningApps>20</maxRunningApps>
<schedulingMode>fair</schedulingMode>
<aclSubmitApps>*</aclSubmitApps>
<weight>1</weight>
<aclAdministerApps>streaming</aclAdministerApps>
</queue>
</queue>
<user name="production">
<!-- 對(duì)于特定用(yòng)戶的(de)配置:production最多(duō)可(kě)以同時(shí)運行的(de)任務 -->
<maxRunningApps>100</maxRunningApps>
</user>
<user name="default">
<!-- 對(duì)于默認用(yòng)戶配置最多(duō)可(kě)以同時(shí)運行的(de)任務 -->
<maxRunningApps>10</maxRunningApps>
</user>
<!-- users max running apps -->
<userMaxAppsDefault>50</userMaxAppsDefault>
<!--默認的(de)用(yòng)戶最多(duō)可(kě)以同時(shí)運行的(de)任務 -->
<queuePlacementPolicy>
<rule name="specified"/>
<rule name="primaryGroup" create="false" />
<rule name="secondaryGroupExistingQueue" create="false" />
<rule name="default" queue="default"/>
</queuePlacementPolicy>
</allocations>
參數介紹:
minResources:最少資源保證量,設置格式爲“X mb, Y vcores”,當一個(gè)隊列的(de)最少資源保證量未滿足時(shí),它将優先于其他(tā)同級隊列獲得(de)資源,對(duì)于不同的(de)調度策略(後面會詳細介紹),最少資源保證量的(de)含義不同,對(duì)于fair策略,則隻考慮内存資源,即如果一個(gè)隊列使用(yòng)的(de)内存資源超過了(le)它的(de)最少資源量,則認爲它已得(de)到了(le)滿足;對(duì)于drf策略,則考慮主資源使用(yòng)的(de)資源量,即如果一個(gè)隊列的(de)主資源量超過它的(de)最少資源量,則認爲它已得(de)到了(le)滿足。
maxResources:最多(duō)可(kě)以使用(yòng)的(de)資源量,fair scheduler會保證每個(gè)隊列使用(yòng)的(de)資源量不會超過該隊列的(de)最多(duō)可(kě)使用(yòng)資源量。
maxRunningApps:最多(duō)同時(shí)運行的(de)應用(yòng)程序數目。通(tōng)過限制該數目,可(kě)防止超量Map Task同時(shí)運行時(shí)産生的(de)中間輸出結果撐爆磁盤。
weight:資源池權重,主要用(yòng)在資源共享之時(shí),weight越大(dà),拿到的(de)資源越多(duō)。比如一個(gè)pool中有20GB内存用(yòng)不了(le),這(zhè)時(shí)候可(kě)以共享給其他(tā)pool,其他(tā)每個(gè)pool拿多(duō)少,就是由權重決定的(de)
aclSubmitApps:可(kě)向隊列中提交應用(yòng)程序的(de)Linux用(yòng)戶或用(yòng)戶組列表,默認情況下(xià)爲“*”,表示任何用(yòng)戶均可(kě)以向該隊列提交應用(yòng)程序。需要注意的(de)是,該屬性具有繼承性,即子隊列的(de)列表會繼承父隊列的(de)列表。配置該屬性時(shí),用(yòng)戶之間或用(yòng)戶組之間用(yòng)“,”分(fēn)割,用(yòng)戶和(hé)用(yòng)戶組之間用(yòng)空格分(fēn)割,比如“user1, user2 group1,group2”。
aclAdministerApps:允許管理(lǐ)任務的(de)用(yòng)戶名和(hé)組;一個(gè)隊列的(de)管理(lǐ)員(yuán)可(kě)管理(lǐ)該隊列中的(de)資源和(hé)應用(yòng)程序,比如可(kě)殺死任意應用(yòng)程序。
minSharePreemptionTimeout :最小共享量搶占時(shí)間。如果一個(gè)資源池在該時(shí)間内使用(yòng)的(de)資源量一直低于最小資源量,則開始搶占資源。
schedulingMode/schedulingPolicy:隊列采用(yòng)的(de)調度模式,可(kě)以是fifo、fair或者drf。
管理(lǐ)員(yuán)也(yě)可(kě)爲單個(gè)用(yòng)戶添加maxRunningJobs屬性限制其最多(duō)同時(shí)運行的(de)應用(yòng)程序數目。此外,管理(lǐ)員(yuán)也(yě)可(kě)通(tōng)過以下(xià)參數設置以上屬性的(de)默認值:
userMaxJobsDefault:用(yòng)戶的(de)maxRunningJobs屬性的(de)默認值。
defaultMinSharePreemptionTimeout :隊列的(de)minSharePreemptionTimeout屬性的(de)默認值。
defaultPoolSchedulingMode:隊列的(de)schedulingMode屬性的(de)默認值。
fairSharePreemptionTimeout:公平共享量搶占時(shí)間。如果一個(gè)資源池在該時(shí)間内使用(yòng)資源量一直低于公平共享量的(de)一半,則開始搶占資源。
這(zhè)樣,每個(gè)用(yòng)戶組下(xià)的(de)用(yòng)戶提交任務時(shí)候,會到相應的(de)資源池中,而不影(yǐng)響其他(tā)業務。隊列的(de)層次是通(tōng)過嵌套
元素實現的(de)。所有的(de)隊列都是root隊列的(de)孩子,即使沒有配到元素裏。Fair調度器中的(de)隊列有一個(gè)權重屬性(這(zhè)個(gè)權重就是對(duì)公平的(de)定義),并把這(zhè)個(gè)屬性作爲公平調度的(de)依據。在這(zhè)個(gè)例子中,當調度器分(fēn)配集群7.5,1,1,0.5資源給production,spark,streaming,default時(shí)便視作公平,這(zhè)裏的(de)權重并不是百分(fēn)比。注意,對(duì)于在沒有配置文件時(shí)按用(yòng)戶自動創建的(de)隊列,它們仍有權重并且權重值爲1。每個(gè)隊列内部仍可(kě)以有不同的(de)調度策略。隊列的(de)默認調度策略可(kě)以通(tōng)過頂級元素進行配置,如果沒有配置,默認采用(yòng)公平調度。盡管是Fair調度器,其仍支持在隊列級别進行FIFO調度。每個(gè)隊列的(de)調度策略可(kě)以被其内部的(de)元素覆蓋,在上面這(zhè)個(gè)例子中,default隊列就被指定采用(yòng)fifo進行調度,所以,對(duì)于提交到default隊列的(de)任務就可(kě)以按照(zhào)FIFO規則順序的(de)執行了(le)。需要注意,spark,production,streaming,default之間的(de)調度仍然是公平調度。每個(gè)隊列可(kě)配置最大(dà)、最小資源占用(yòng)數和(hé)最大(dà)可(kě)運行的(de)應用(yòng)的(de)數量。
Fair調度器采用(yòng)了(le)一套基于規則的(de)系統來(lái)确定應用(yòng)應該放到哪個(gè)隊列。在上面的(de)例子中,元素定義了(le)一個(gè)規則列表,其中的(de)每個(gè)規則會被逐個(gè)嘗試直到匹配成功。例如,上例第一個(gè)規則specified,則會把應用(yòng)放到它指定的(de)隊列中,若這(zhè)個(gè)應用(yòng)沒有指定隊列名或隊列名不存在,則說明(míng)不匹配這(zhè)個(gè)規則,然後嘗試下(xià)一個(gè)規則。primaryGroup規則會嘗試把應用(yòng)放在以用(yòng)戶所在的(de)Unix組名命名的(de)隊列中,如果沒有這(zhè)個(gè)隊列,不創建隊列轉而嘗試下(xià)一個(gè)規則。當前面所有規則不滿足時(shí),則觸發default規則,把應用(yòng)放在default隊列中。
當然,我們可(kě)以不配置queuePlacementPolicy規則,調度器則默認采用(yòng)如下(xià)規則:
<queuePlacementPolicy>
<rule name="specified" />
<rule name="user" />
</queuePlacementPolicy>
上面規則意思是除非隊列被準确的(de)定義,否則會以用(yòng)戶名爲隊列名創建隊列。還(hái)有一個(gè)簡單的(de)配置策略可(kě)以使得(de)所有的(de)應用(yòng)放入同一個(gè)隊列(default),這(zhè)樣就可(kě)以讓所有應用(yòng)之間平等共享集群而不是在用(yòng)戶之間。這(zhè)個(gè)配置的(de)定義如下(xià):
<queuePlacementPolicy>
<rule name="default" />
</queuePlacementPolicy>
實現上面功能我們還(hái)可(kě)以不使用(yòng)配置文件,直接設置yarn.scheduler.fair.user-as-default-queue=false,這(zhè)樣應用(yòng)便會被放入default 隊列,而不是各個(gè)用(yòng)戶名隊列。另外,我們還(hái)可(kě)以設置yarn.scheduler.fair.allow-undeclared-pools=false,這(zhè)樣用(yòng)戶就無法創建隊列了(le)。
當一個(gè)job提交到一個(gè)繁忙集群中的(de)空隊列時(shí),job并不會馬上執行,而是阻塞直到正在運行的(de)job釋放系統資源。爲了(le)使提交job的(de)執行時(shí)間更具預測性(可(kě)以設置等待的(de)超時(shí)時(shí)間),Fair調度器支持搶占。搶占就是允許調度器殺掉占用(yòng)超過其應占份額資源隊列的(de)containers,這(zhè)些containers資源便可(kě)被分(fēn)配到應該享有這(zhè)些份額資源的(de)隊列中。需要注意搶占會降低集群的(de)執行效率,因爲被終止的(de)containers需要被重新執行。可(kě)以通(tōng)過設置一個(gè)全局的(de)參數yarn.scheduler.fair.preemption=true來(lái)啓用(yòng)搶占功能。此外,還(hái)有兩個(gè)參數用(yòng)來(lái)控制搶占的(de)過期時(shí)間(這(zhè)兩個(gè)參數默認沒有配置,需要至少配置一個(gè)來(lái)允許搶占Container):
minSharePreemptionTimeout
fairSharePreemptionTimeout
如果隊列在minimum share preemption timeout指定的(de)時(shí)間内未獲得(de)最小的(de)資源保障,調度器就會搶占containers。我們可(kě)以通(tōng)過配置文件中的(de)頂級元素</defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout></defaultminsharepreemptiontimeout>爲所有隊列配置這(zhè)個(gè)超時(shí)時(shí)間;我們還(hái)可(kě)以在元素内配置元素來(lái)爲某個(gè)隊列指定超時(shí)時(shí)間。</defaultminsharepreemptiontimeout>
與之類似,如果隊列在fair share preemption timeout指定時(shí)間内未獲得(de)平等的(de)資源的(de)一半(這(zhè)個(gè)比例可(kě)以配置),調度器則會進行搶占containers。這(zhè)個(gè)超時(shí)時(shí)間可(kě)以通(tōng)過頂級元素<defaultfairsharepreemptiontimeout style="font-size: inherit;color: inherit;line-height: inherit;">和(hé)元素級元素分(fēn)别配置所有隊列和(hé)某個(gè)隊列的(de)超時(shí)時(shí)間。上面提到的(de)比例可(kě)以通(tōng)過<defaultfairsharepreemptionthreshold style="font-size: inherit;color: inherit;line-height: inherit;">(配置所有隊列)和(hé)(配置某個(gè)隊列)進行配置,默認是0.5。</defaultfairsharepreemptionthreshold></defaultfairsharepreemptiontimeout>
需要注意的(de)是,所有客戶端提交任務的(de)用(yòng)戶和(hé)用(yòng)戶組的(de)對(duì)應關系,需要維護在ResourceManager上,ResourceManager在分(fēn)配資源池時(shí)候,是從ResourceManager上讀取用(yòng)戶和(hé)用(yòng)戶組的(de)對(duì)應關系的(de),否則就會被分(fēn)配到default資源池。在日志中出現”UserGroupInformation: No groups available for user”類似的(de)警告。而客戶端機器上的(de)用(yòng)戶對(duì)應的(de)用(yòng)戶組無關緊要。
每次在ResourceManager上新增用(yòng)戶或者調整資源池配額後,需要執行下(xià)面的(de)命令刷新使其生效.
yarn rmadmin -refreshQueues yarn rmadmin -refreshUserToGroupsMappings
動态更新隻支持修改資源池配額,如果是新增或減少資源池,則需要重啓Yarn集群.
Fair Scheduer各資源池配置及使用(yòng)情況,在ResourceManager的(de)WEB監控頁面上也(yě)可(kě)以看到: http://ResourceManagerHost:8088/cluster/scheduler
2.2 Capacity 配置
hadoop2.7默認使用(yòng)的(de)是Capacity Scheduler容量調度器
yarn-site.xml
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.capacity.CapacityScheduler</value>
</property>
Capacity 調度器允許多(duō)個(gè)組織共享整個(gè)集群,每個(gè)組織可(kě)以獲得(de)集群的(de)一部分(fēn)計算(suàn)能力。通(tōng)過爲每個(gè)組織分(fēn)配專門的(de)隊列,然後再爲每個(gè)隊列分(fēn)配一定的(de)集群資源,這(zhè)樣整個(gè)集群就可(kě)以通(tōng)過設置多(duō)個(gè)隊列的(de)方式給多(duō)個(gè)組織提供服務了(le)。除此之外,隊列内部又可(kě)以垂直劃分(fēn),這(zhè)樣一個(gè)組織内部的(de)多(duō)個(gè)成員(yuán)就可(kě)以共享這(zhè)個(gè)隊列資源了(le),在一個(gè)隊列内部,資源的(de)調度是采用(yòng)的(de)是先進先出(FIFO)策略。
一個(gè)job可(kě)能使用(yòng)不了(le)整個(gè)隊列的(de)資源。然而如果這(zhè)個(gè)隊列中運行多(duō)個(gè)job,如果這(zhè)個(gè)隊列的(de)資源夠用(yòng),那麽就分(fēn)配給這(zhè)些job,如果這(zhè)個(gè)隊列的(de)資源不夠用(yòng)了(le)呢(ne)?其實Capacity調度器仍可(kě)能分(fēn)配額外的(de)資源給這(zhè)個(gè)隊列,這(zhè)就是“彈性隊列”(queue elasticity)的(de)概念。
在正常的(de)操作中,Capacity調度器不會強制釋放Container,當一個(gè)隊列資源不夠用(yòng)時(shí),這(zhè)個(gè)隊列隻能獲得(de)其它隊列釋放後的(de)Container資源。當然,我們可(kě)以爲隊列設置一個(gè)最大(dà)資源使用(yòng)量,以免這(zhè)個(gè)隊列過多(duō)的(de)占用(yòng)空閑資源,導緻其它隊列無法使用(yòng)這(zhè)些空閑資源,這(zhè)就是”彈性隊列”需要權衡的(de)地方。
假設我們有如下(xià)層次的(de)隊列:
root
├── prod
└── dev
├── eng
└── science
下(xià)面是一個(gè)簡單的(de)Capacity調度器的(de)配置文件,文件名爲capacity-scheduler.xml。在這(zhè)個(gè)配置中,在root隊列下(xià)面定義了(le)兩個(gè)子隊列prod和(hé)dev,分(fēn)别占40%和(hé)60%的(de)容量。需要注意,一個(gè)隊列的(de)配置是通(tōng)過屬性yarn.sheduler.capacity..指定的(de),代表的(de)是隊列的(de)繼承樹,如root.prod隊列,一般指capacity和(hé)maximum-capacity。
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues(/&eae)
<value>prod,dev</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.queues</tta*e>
<value>eng,science</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.prod.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value >60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.maximuin-capacity</name>
<value>75</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.eng.capacity</name>
<value >50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.science.capacity</name>
<value >50</value>
</property>
</configuration>
我們可(kě)以看到,dev隊列又被分(fēn)成了(le)eng和(hé)science兩個(gè)相同容量的(de)子隊列。dev的(de)maximum-capacity屬性被設置成了(le)75%,所以即使prod隊列完全空閑dev也(yě)不會占用(yòng)全部集群資源,也(yě)就是說,prod隊列仍有25%的(de)可(kě)用(yòng)資源用(yòng)來(lái)應急。我們注意到,eng和(hé)science兩個(gè)隊列沒有設置maximum-capacity屬性,也(yě)就是說eng或science隊列中的(de)job可(kě)能會用(yòng)到整個(gè)dev隊列的(de)所有資源(最多(duō)爲集群的(de)75%)。而類似的(de),prod由于沒有設置maximum-capacity屬性,它有可(kě)能會占用(yòng)集群全部資源。Capacity容器除了(le)可(kě)以配置隊列及其容量外,我們還(hái)可(kě)以配置一個(gè)用(yòng)戶或應用(yòng)可(kě)以分(fēn)配的(de)最大(dà)資源數量、可(kě)以同時(shí)運行多(duō)少應用(yòng)、隊列的(de)ACL認證等。
關于隊列的(de)設置,這(zhè)取決于我們具體的(de)應用(yòng)。比如,在MapReduce中,我們可(kě)以通(tōng)過mapreduce.job.queuename屬性指定要用(yòng)的(de)隊列。如果隊列不存在,我們在提交任務時(shí)就會收到錯誤。如果我們沒有定義任何隊列,所有的(de)應用(yòng)将會放在一個(gè)default隊列中。
注意:對(duì)于Capacity調度器,我們的(de)隊列名必須是隊列樹中的(de)最後一部分(fēn),如果我們使用(yòng)隊列樹則不會被識别。比如,在上面配置中,我們使用(yòng)prod和(hé)eng作爲隊列名是可(kě)以的(de),但是如果我們用(yòng)root.dev.eng或者dev.eng是無效的(de)。
2.3 FIFO Scheduler
yarn-site.xml文件
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.fifo.FifoScheduler</value>
</property>