1: yarn ?資源調(diào)度的定義
2: yarn 資源調(diào)度的種類
在Yarn中有三種調(diào)度器可以選擇:FIFO Scheduler?杠览,Capacity Scheduler惜论,F(xiàn)airS cheduler个榕。
3:?FIFO Scheduler?
? ? 3.1?FIFO Scheduler 介紹
把應(yīng)用按提交的順序排成一個隊列妻柒,這是一個先進(jìn)先出隊列祝沸,在進(jìn)行資源分配的時候封恰,先給隊列中最頭上的應(yīng)用進(jìn)行分配資源麻养,待最頭上的應(yīng)用需求滿足后再給下一個分配
將所有的Applications放到隊列中,先按照作業(yè)的優(yōu)先級高低诺舔、再按照到達(dá)時間的先后鳖昌,為每個app分配資源备畦。如果第一個app需要的資源被滿足了,如果還剩下了資源并且滿足第二個app需要的資源许昨,那么就為第二個app分配資源懂盐,and so on。
優(yōu)點:簡單糕档,不需要配置莉恼。
缺點:不適合共享集群。如果有大的app需要很多資源速那,那么其他app可能會一直等待俐银。
上圖的示例:有一個很大的job1,它先提交端仰,并且占據(jù)了全部的資源捶惜。那么job2提交時發(fā)現(xiàn)沒有資源了,則job2必須等待job1執(zhí)行結(jié)束荔烧,才能獲得資源執(zhí)行吱七。
? ?3.2 使用FIFO Scheduler
? 默認(rèn)是 FIFO Scheduler, FIFO?Scheduler中沒有劃分隊列的概念茴晋。
yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler
? ? 3.3 配置參數(shù)
? ?FIFO Scheduler不需要配置
4:?Capacity Scheduler
? ?4.1?Capacity Scheduler 介紹
Capacity Scheduler主要是為了解決多租戶(multiple-tenants)的問題陪捷,也就是為了做資源隔離回窘,讓不同的組織使用各自的資源诺擅,不相互影響,同時提高整個集群的利用率和吞吐量啡直。Capacity Scheduler里面的核心概念或者資源就是隊列(queue)烁涌。概念理解上很簡單,分多個隊列酒觅,每個隊列分配一部分資源撮执,不同組織的應(yīng)用運行在各自的隊列里面,從而做到資源隔離舷丹。但為了提高資源(主要是CPU和內(nèi)存)利用率和系統(tǒng)吞吐量抒钱,在情況允許的情況下,允許隊列之間的資源搶占颜凯。
? ?4.2 使用Capacity Scheduler
?yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler谋币。
Capacity調(diào)度器默認(rèn)有一個預(yù)定義的隊列——root,所有的隊列都是它的子隊列。隊列的分配支持層次化的配置症概,使用.來進(jìn)行分割蕾额,比如yarn.scheduler.capacity.<queue-path>.queues.
$HADOOP_HOME/etc/hadoop/capacity-scheduler.xml 增加如下配置:
<property>name>yarn.scheduler.capacity.root.queues</name>value>prod,dev</value></property>
<property><name>yarn.scheduler.capacity.root.dev.queues</name<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.maximum-capacity</name><value>75</value></property>
? ?4.3 配置參數(shù)
? ? 4.3.1 隊列配置參數(shù)
? ? ?yarn.scheduler.capacity.root.accessible-node-labels
? ? ?yarn.scheduler.capacity.root.acl_administer_queue ??設(shè)置隊列的管理員的ACL控制,管理員可以控制隊列的所有應(yīng)用程序彼城。同樣诅蝶,它也具有繼承性退个。
? ? ?yarn.scheduler.capacity.root.acl_submit_applications?訪問控制列表ACL控制誰可以向該隊列提交任務(wù)。如果一個用戶可以向該隊列提交调炬,那么也可以提交任務(wù)到它的子隊列
? ? ?yarn.scheduler.capacity.root.capacity ?100 ??它是隊列的資源容量占比(百分比)语盈。應(yīng)保證每個隊列的容量得到滿足,而如果每個隊列應(yīng)用程序較少筐眷,可將剩余資源共享給其他隊列黎烈。同一層的所有隊列加起來必須是100%。
? ??yarn.scheduler.capacity.root.dataplatform.accessible-node-labels
? ? ?yarn.scheduler.capacity.root.dataplatform.acl_administer_queue?設(shè)置隊列的管理員的ACL控制匀谣,管理員可以控制隊列的所有應(yīng)用程序照棋。同樣,它也具有繼承性武翎。注意:ACL的設(shè)置是user1,user2 group1,group2這種格式烈炭。如果是*則代表任何人”Χ瘢空格表示任何人都不允許符隙。默認(rèn)是*.
? ? yarn.scheduler.capacity.root.dataplatform.acl_submit_applications
? ??yarn.scheduler.capacity.root.dataplatform.capacity ?它是隊列的資源容量占比(百分比)。系統(tǒng)繁忙時垫毙,每個隊列都應(yīng)該得到設(shè)置的量的資源霹疫;當(dāng)系統(tǒng)空閑時,該隊列的資源則可以被其他的隊列使用综芥。同一層的所有隊列加起來必須是100%丽蝎。
? ??yarn.scheduler.capacity.root.dataplatform.maximum-am-resource-percent ?設(shè)置有多少資源可以用來運行app master,即控制當(dāng)前激活狀態(tài)的應(yīng)用膀藐。默認(rèn)是10%
? ??yarn.scheduler.capacity.root.dataplatform.maximum-capacity ?隊列資源的使用上限屠阻。由于系統(tǒng)空閑時,隊列可以使用其他的空閑資源额各,因此最多使用的資源量則是該參數(shù)控制国觉。默認(rèn)是-1,即禁用虾啦。隊列的資源使用上限(百分比)麻诀。由于存在資源共享,因此一個隊列使用的資源量可能超過其容量傲醉,而最多使用資源量可通過該參數(shù)限制
? ??yarn.scheduler.capacity.root.dataplatform.ordering-policy fair
? ??yarn.scheduler.capacity.root.dataplatform.ordering-policy.fair.enable-size-based-weight?false
? ??yarn.scheduler.capacity.root.dataplatform.priority 0
? ??yarn.scheduler.capacity.root.dataplatform.state ?RUNNING?隊列的狀態(tài)蝇闭,可以使RUNNING或者STOPPED.如果隊列是STOPPED狀態(tài),那么新應(yīng)用不會提交到該隊列或者子隊列需频。同樣丁眼,如果root被設(shè)置成STOPPED,那么整個集群都不能提交任務(wù)了≌蜒常現(xiàn)有的應(yīng)用可以等待完成苞七,因此隊列可以優(yōu)雅的退出關(guān)閉藐守。
? yarn.scheduler.capacity..minimum-user-limit-percent ?每個任務(wù)占用的最少資源。比如蹂风,你設(shè)置成了25%卢厂。那么如果有兩個用戶提交任務(wù),那么每個任務(wù)資源不超過50%惠啄。如果3個用戶提交任務(wù)慎恒,那么每個任務(wù)資源不超過33%。如果4個用戶提交任務(wù)撵渡,那么每個任務(wù)資源不超過25%融柬。如果5個用戶提交任務(wù),那么第五個用戶需要等待才能提交趋距。默認(rèn)是100粒氧,即不去做限制。
? ??yarn.scheduler.capacity.root.dataplatform.user-limit-factor ? ?每個用戶最多使用的隊列資源占比节腐,如果設(shè)置為50.那么每個用戶使用的資源最多就是50%外盯。
? ? ?4.3.2 ?capacity搶占配置參數(shù)
YARN Capacity Scheduler開啟搶占需要配置如下參數(shù):
yarn.resourcemanager.scheduler.monitor.enable? 這個選項通知RM來開啟monitoring policy;
yarn.resourcemanager.scheduler.monitor.policies?開啟搶占模式翼雀, 設(shè)置monitor policies為org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy
yarn.resourcemanager.monitor.capacity.preemption.monitoring_interval?
搶占發(fā)生的每輪時間間隔饱苟,默認(rèn)為3秒。每次調(diào)用搶占策略(preemption-policy)將會掃描目前正在使用的隊列狼渊、正在運行的任務(wù)以及container箱熬,根據(jù)這些信息來判斷哪個container將會被搶占。
yarn.resourcemanager.monitor.capacity.preemption.max_wait_before_kill?
這個時間是當(dāng)一個container被標(biāo)記為被搶占到強制殺死該container的時間間隔囤锉,單位為毫秒坦弟。默認(rèn)情況下护锤,在強制殺死該container的之前官地, 將等待15秒讓AM釋放資源。
yarn.resourcemanager.monitor.capacity.preemption.total_preemption_per_round?
每一輪最大的能夠搶占的資源的百分比烙懦,默認(rèn)為0.1驱入。例如,集群的內(nèi)存總量為100G氯析,如果設(shè)置為0.1亏较,那么每一輪搶占最多可以搶占10G的資源。
yarn.resourcemanager.monitor.capacity.preemption.max_ignored_over_capacity?
指定當(dāng)一個隊列使用的大小超過一個百分比時掩缓,這個隊列才可以會被搶占雪情。假設(shè)這個值為x,那么RM將會等到這個隊列的使用量達(dá)到configured_capacity*(1 + x)時才會搶占它你辣。默認(rèn)為0.1巡通。
yarn.resourcemanager.monitor.capacity.preemption.natural_termination_factor?
每一輪搶占的所需資源的百分比尘执,通過設(shè)置這個參數(shù)來減緩回收的速度,避免回收動作過于激進(jìn)宴凉。例如誊锭,設(shè)置這個參數(shù)為0.2,隊列A還需要從隊列B搶占5G資源弥锄,那么第一輪A將從B搶占5*0.2=1G丧靡,第二輪將搶占4*0.2=0.8G。默認(rèn)為0.2籽暇。
4.3.3 node label功能
? ? 1) node label功能介紹
? ??Node label是將相似特點的節(jié)點進(jìn)行分組的一種途徑温治,application可以指定在哪里運行。現(xiàn)在我們只支持node partition:
一個node只能有一個node partition, 所以一個集群通過node partition被分為多個互斥的子集群戒悠。默認(rèn)的罐盔,node都屬于DEFAULT分區(qū)(partition="")。
目前Node Labels支持以下特性:
Partition cluster - 每個node可以指定一個label救崔,所以集群將會被分為多個小的互斥的partition惶看。
ACL of node-labels on queues - 用戶能夠設(shè)置每個隊列可訪問的node label,所以只有某些node可以被特定隊列訪問六孵。
指定可以被隊列訪問的partition的資源百分比- 用戶可以設(shè)置像這樣的百分比:隊列A可以訪問具備lable=hbase label的node30%的資源纬黎。這樣的百分比設(shè)置將會與現(xiàn)存的資源管理器保持一致。
在資源請求中指定必需的Node Label劫窒,它將會被分配到具有相同label的node本今。如果沒有指定必需的node label,那么資源請求將會被分配到屬于DEFAULT partition的node主巍。
可運維性
Node Label和節(jié)點的標(biāo)簽映射可以在RM restart中恢復(fù)冠息。
Update node labels -更新node label-管理員可以在RM運行過程中更新node、隊列的labels孕索。
? ? 2) 啟用node lable功能
<property> <name>yarn.node-labels.enabled</name>
????<value>true</value></property>
<property> ? ?<name>yarn.node-labels.fs-store.root-dir</name> ? <value>hdfs://ns1/system/yarn/node-labels></property>
<property>
????<name>yarn.node-labels.manager-class</name>
????<value>org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager</value>
</property>
? ? 3) 配置node lable功能
參考資料:https://han-zw.iteye.com/blog/2326433
1) 為 node添加 label
創(chuàng)建標(biāo)簽列表: ?yarn?rmadmin?-addToClusterNodeLabels?normal,cpu
給節(jié)點打標(biāo)簽:?yarn?rmadmin?-replaceLabelsOnNode?s3.cxy7.com,normal
yarn?rmadmin?-replaceLabelsOnNode?s4.cxy7.com,cpu
查看HDFS上的標(biāo)簽文件:hadoop?fs?-ls?/system/yarn/node-labels
執(zhí)行?yarn rmadmin -replaceLabelsOnNode “node1[:port]=label1 node2=label2”逛艰,增加label1到node1,label2到node2.如果用戶沒有指定port搞旭,它將會添加到運行在node上的所有NodeManager散怖。
2)?添加隊列與標(biāo)簽的匹配關(guān)系,修改capacity-scheduler.xml
<!--?配置dev和product隊列可使用的標(biāo)簽資源占比?-->
??<property>?
????<name>yarn.scheduler.capacity.root.dev.accessible-node-labels.normal.capacity</name>??
????<value>100</value>
??</property>
??<property>?
????<name>yarn.scheduler.capacity.root.product.accessible-node-labels.cpu.capacity</name>??
????<value>100</value>
??</property>
??</property>
??<!--?配置dev隊列可使用的標(biāo)簽?-->
??<property>?
????<name>yarn.scheduler.capacity.root.dev.accessible-node-labels</name>??
????<value>normal</value>
??</property>
??<property>?
????<name>yarn.scheduler.capacity.root.dev.default-node-label-expression</name>??
????<value>normal</value>
??</property>
注意: yarn.scheduler.capacity.<queue-path>.default-node-label-expression?值類似于"hbase",它的意思是:如果提交到隊列的application肄渗,在其資源請求中沒有指定node label镇眷,它會使用hbase作為default-node-label-expression。默認(rèn)值為空翎嫡,所以application會從沒有node label的節(jié)點中獲取容器欠动。
4.3.4 其他配置參數(shù)
??yarn.scheduler.capacity.maximum-am-resource-percent ?設(shè)置最多有多少資源可以用來運行app master,即控制當(dāng)前激活狀態(tài)的應(yīng)用惑申。默認(rèn)是10%
? yarn.scheduler.capacity.maximum-applications?設(shè)置系統(tǒng)中可以同時運行和等待的應(yīng)用數(shù)量具伍。默認(rèn)是10000.
?yarn.scheduler.capacity.node-locality-delay ?參見6?錯失的調(diào)度機會數(shù)铆遭,在這之后CapacityScheduler將會嘗試調(diào)度本地機架的容器。典型的沿猜,應(yīng)該設(shè)置為集群中節(jié)點的數(shù)量值枚荣。默認(rèn)設(shè)置值約等于一個機架的節(jié)點數(shù),為40.值為正整數(shù)啼肩。
?yarn.scheduler.capacity.queue-mappings ?配置項指定用戶/組到特定隊列的映射橄妆。你可以映射一個用戶或者一個用戶列表到隊列。語法:[u or g]:[name]:[queue_name][,next_mapping]*祈坠。這里害碾,u或者g表明這個映射是針對用戶還是租的。值u是針對用戶赦拘,g是針對組慌随。name 表示用戶名或者組名。要指定提交應(yīng)用程序的用戶躺同,可以用%user表示阁猜。queue_name表示應(yīng)用程序映射的隊列的名稱。要指定隊列名稱與用戶名稱相同蹋艺,可以用%user表示剃袍。要指定隊列名稱與用戶所屬的首要組名相同,可以用%primary_group表示捎谨。
?yarn.scheduler.capacity.queue-mappings-override.enable ?本人true 這個功能用于指定是否用戶指定的隊列可以被覆蓋民效。這是布爾值,默認(rèn)為false涛救。
?yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator ?資源計算器畏邢。資源計算的實現(xiàn)用于在調(diào)度器中比較資源。默認(rèn)如org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator只使用內(nèi)存检吆,然而DominantResourceCalculator 用主導(dǎo)資源比較多維度資源舒萎,例如內(nèi)存,CPU等等咧栗。值為java類名
4.3.5 配置生效
修改隊列屬性逆甜、添加新隊列是非常簡單的虱肄。你需要編輯conf/capacity-scheduler.xml 并運行 yarn rmadmin -refreshQueues
$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
yarn rmadmin -refreshQueues使變更生效
備注:隊列不能刪除致板,只支持隊列的新增——更新隊列配置應(yīng)該是一個有效值,例如隊列容量在每一個層級應(yīng)該等于100%咏窿。
4.3.6 application 如何指定 node label
1) mapreduce ?
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.4.jar wordcount -D mapreduce.job.node-label-expression="fastcpu" -D mapreduce.job.queuename="etl-ywpt" /hadoop-hadoop-namenode-container-192-168-200-140.log /output
2) spark
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 3g --executor-memory 2g --conf spark.yarn.am.nodeLabelExpression=fastcpu --conf spark.yarn.executor.nodeLabelExpression=fastcpu jars/spark-examples.jar 10
5:?Fair Scheduler
5.1?Fair Scheduler介紹
??公平調(diào)度器FairScheduler基于內(nèi)存來安排公平調(diào)度策略斟或。不像Hadoop的默認(rèn)調(diào)度器,它只將任務(wù)構(gòu)造一個應(yīng)用隊列集嵌,公平調(diào)度器會在不餓死長周期作業(yè)的同時萝挤,優(yōu)先讓短周期作業(yè)先運行完成御毅。在一組用戶中共享集群也是合理的。最終怜珍,公平調(diào)度策略可以和應(yīng)用優(yōu)先級結(jié)合起來工作端蛆,優(yōu)先級是一組權(quán)重值,資源會按照這個權(quán)重比例來分配給每個應(yīng)用酥泛。
FairScheduler允許所有的應(yīng)用按照默認(rèn)配置運行今豆,同時也支持通過配置文件來限制每個用戶每個隊列的運行作業(yè)數(shù)。這對于一個用戶必須一次提交成百上千的應(yīng)用作業(yè)是有幫助的柔袁。限制運行的應(yīng)用作業(yè)數(shù)呆躲,不會導(dǎo)致任何的已提交作業(yè)失敗,只會讓這些作業(yè)在調(diào)度器隊列中等待直到某些用戶的更早的作業(yè)結(jié)束捶索。
5.2 使用Fair Scheduler
yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
5.3 配置Fair Scheduler
配置FairScheduler一般需要配置兩個文件插掂。首先調(diào)度器相關(guān)的選項可以在yarn-site.xml文件中配置。其次腥例,大多數(shù)情況下用戶希望創(chuàng)建一個分配文件來列出哪些隊列用來分配以及對應(yīng)的權(quán)重和容量辅甥。這個分配文件會每10秒鐘重新加載一次,從而支持運行時配置變更燎竖。
5.3.1 yarn-site.xml 中配置
?yarn.scheduler.fair.allocation.file ??分配文件的路徑地址肆氓。分配文件是一個XML文件來描述隊列和隊列的屬性以及特定的策略。這個文件必須是一個XML格式的文件底瓣。如果配置一個相對路徑谢揪,那么該文件會在classpath中被搜索到。默認(rèn)是
捐凭。如:?/etc/hadoop/conf/fair-scheduler.xml
yarn.scheduler.fair.user-as-default-queue?是否使用用戶名關(guān)聯(lián)分配的默認(rèn)隊列名稱拨扶,如果是false或者未設(shè)置,所有的作業(yè)都有一個共享的默認(rèn)隊列茁肠,叫做default患民。默認(rèn)是true。如果隊列分配策略在分配文件中配置過垦梆,那么這個屬性會被忽略匹颤。簡而言之就是用用戶名作為隊列。
yarn.scheduler.fair.preemption ?開啟資源搶占托猩。?默認(rèn)false印蓖。
yarn.scheduler.fair.sizebasedweight ?以作業(yè)的規(guī)模大小作為調(diào)度的權(quán)值,默認(rèn)為false京腥。在一個隊列內(nèi)部分配資源時赦肃,默認(rèn)情況下,采用公平輪詢的方法將資源分配各各個應(yīng)用程序,而該參數(shù)則提供了另外一種資源分配方式:按照應(yīng)用程序資源需求數(shù)目分配資源他宛,即需求資源數(shù)量越多船侧,分配的資源越多。默認(rèn)情況下厅各,該參數(shù)值為false镜撩。設(shè)置為true時,應(yīng)用的權(quán)重通過1+請求資源內(nèi)存大小的自然對數(shù)來計算队塘。
yarn.scheduler.fair.assignmultiple ?是否允許在一次心跳中進(jìn)行多次容器分配琐鲁。默認(rèn)是false
yarn.scheduler.fair.max.assign ?如果上個屬性設(shè)置為true,這個屬性明確一次心跳中能分配的最大的容器數(shù)人灼。默認(rèn)是-1围段,表示沒有限制。
yarn.scheduler.fair.allow-undeclared-pools?該屬性默認(rèn)是true 投放,如果設(shè)置成true奈泪,yarn將會自動創(chuàng)建任務(wù)中指定的未定義過的資源池。設(shè)置成false之后灸芳,任務(wù)中指定的未定義的資源池將無效涝桅,該任務(wù)會被分配到default資源池中。
yarn.scheduler.fair.update-interval-ms ?鎖定調(diào)度器和重新計算資源分配和需求烙样,檢查是否有搶占的時間間隔屬性冯遂。默認(rèn)是500m
yarn.scheduler.fair.locality.threshold.node 當(dāng)應(yīng)用程序請求某個節(jié)點上資源時,它可以接受的可跳過的最大資源調(diào)度機會谒获。當(dāng)按照分配策略蛤肌,可將一個節(jié)點上的資源分配給某個應(yīng)用程序時,如果該節(jié)點不是應(yīng)用程序期望的節(jié)點批狱,可選擇跳過該分配機會暫時將資源分配給其他應(yīng)用程序裸准,直到出現(xiàn)滿足該應(yīng)用程序需的節(jié)點資源出現(xiàn)。通常而言赔硫,一次心跳代表一次調(diào)度機會炒俱,而該參數(shù)則表示跳過調(diào)度機會占節(jié)點總數(shù)的比例,默認(rèn)情況下爪膊,該值為-1.0权悟,表示不跳過任何調(diào)度機會。
?yarn.scheduler.increment-allocation-mb:內(nèi)存規(guī)整化單位推盛,默認(rèn)是1024峦阁,這意味著,如果一個Container請求資源是1.5GB小槐,則將被調(diào)度器規(guī)整化為ceiling(1.5 GB / 1GB) * 1G=2GB拇派。
yarn.scheduler.increment-allocation-vcores:虛擬CPU規(guī)整化單位荷辕,默認(rèn)是1凿跳,含義與內(nèi)存規(guī)整化單位類似件豌。
5.3.2 自定義中配置fair-scheduler.xml
? ? ? demo如下:
<?xml version=”1.0″?>
<allocations>
<queue name=”root”>
<minResources>51200mb,50vcores</minResources>
<maxResources>102400mb,100vcores</maxResources>
<maxRunningApps>100</maxRunningApps>
<weight>1.0</weight>
<schedulingMode>fair</schedulingMode>
<aclSubmitApps> </aclSubmitApps>
<aclAdministerApps> </aclAdministerApps>
<queue name=”default”>
<minResources>10240mb,10vcores</minResources>
<maxResources>30720mb,30vcores</maxResources>
<maxRunningApps>100</maxRunningApps>
<schedulingMode>fair</schedulingMode>
<weight>1.0</weight>
<aclSubmitApps>*</aclSubmitApps>
</queue>
<queue name=”businessA”>
<minResources>5120mb,5vcores</minResources>
<maxResources>20480mb,20vcores</maxResources>
<maxRunningApps>100</maxRunningApps>
<schedulingMode>fair</schedulingMode>
<weight>2.0</weight>
<aclSubmitApps>businessA,lxw1234 group_businessA,group_lxw1234</aclSubmitApps>
<aclAdministerApps>businessA,hadoop group_businessA,supergroup</aclAdministerApps>
</queue>
</queue>
</allocations>
參數(shù)如下:
(1)minResources:最少資源保證量,設(shè)置格式為“X mb, Y vcores”控嗜,當(dāng)一個隊列的最少資源保證量未滿足時茧彤,它將優(yōu)先于其他同級隊列獲得資源,對于不同的調(diào)度策略(后面會詳細(xì)介紹)疆栏,最少資源保證量的含義不同曾掂,對于fair策略,則只考慮內(nèi)存資源壁顶,即如果一個隊列使用的內(nèi)存資源超過了它的最少資源量珠洗,則認(rèn)為它已得到了滿足;對于drf策略若专,則考慮主資源使用的資源量许蓖,即如果一個隊列的主資源量超過它的最少資源量,則認(rèn)為它已得到了滿足调衰。
(2)maxResources:最多可以使用的資源量膊爪,fair scheduler會保證每個隊列使用的資源量不會超過該隊列的最多可使用資源量。
(3)maxRunningApps:最多同時運行的應(yīng)用程序數(shù)目嚎莉。通過限制該數(shù)目米酬,可防止超量Map Task同時運行時產(chǎn)生的中間輸出結(jié)果撐爆磁盤。
(4)minSharePreemptionTimeout:最小共享量搶占時間趋箩。如果一個資源池在該時間內(nèi)使用的資源量一直低于最小資源量赃额,則開始搶占資源。
(5)schedulingMode/schedulingPolicy:隊列采用的調(diào)度模式叫确,可以是fifo爬早、fair或者drf。
(6)aclSubmitApps:可向隊列中提交應(yīng)用程序的Linux用戶或用戶組列表启妹,默認(rèn)情況下為“*”筛严,表示任何用戶均可以向該隊列提交應(yīng)用程序。需要注意的是饶米,該屬性具有繼承性桨啃,即子隊列的列表會繼承父隊列的列表。配置該屬性時檬输,用戶之間或用戶組之間用“照瘾,”分割,用戶和用戶組之間用空格分割丧慈,比如“user1, user2 group1,group2”析命。
(7)aclAdministerApps:該隊列的管理員列表主卫。一個隊列的管理員可管理該隊列中的資源和應(yīng)用程序,比如可殺死任意應(yīng)用程序鹃愤。
管理員也可為單個用戶添加maxRunningJobs屬性限制其最多同時運行的應(yīng)用程序數(shù)目簇搅。此外,管理員也可通過以下參數(shù)設(shè)置以上屬性的默認(rèn)值:
(1)userMaxJobsDefault:用戶的maxRunningJobs屬性的默認(rèn)值软吐。
(2)defaultMinSharePreemptionTimeout:隊列的minSharePreemptionTimeout屬性的默認(rèn)值瘩将。
(3)defaultPoolSchedulingMode:隊列的schedulingMode屬性的默認(rèn)值。
(4)fairSharePreemptionTimeout:公平共享量搶占時間凹耙。如果一個資源池在該時間內(nèi)使用資源量一直低于公平共享量的一半姿现,則開始搶占資源。
6: 延時調(diào)度
當(dāng)應(yīng)用程序請求在某個特定的節(jié)點上運行時肖抱,如果該節(jié)點剛好處于忙碌狀態(tài)無法分配給應(yīng)用备典,一種選擇方式是就近選擇同一機架中的其他節(jié)點。但是在實際中發(fā)現(xiàn)意述,稍微等一小段時間提佣,很有可能就能夠分配到指定的節(jié)點,進(jìn)而提高集群效率欲险。這個特性叫延遲調(diào)度(delay scheduling)镐依。Capacity Scheduler和FairScheduler支持這個特性。
默認(rèn)情況下天试,集群中的NodeManager每一秒中都想RM發(fā)送心跳槐壳,心跳張包含節(jié)點當(dāng)前正在運行的Container以及可用于新Container的資源。因此每次心跳都是一個調(diào)度機會(scheduling opportunity)喜每。當(dāng)啟用延遲調(diào)度時务唐,對于有節(jié)點位置要求的資源請求,調(diào)度器不會簡單地使用第一次調(diào)度機會(犧牲數(shù)據(jù)locality)带兜,而是會嘗試等待直到最大次數(shù)的調(diào)度機會枫笛,一旦發(fā)現(xiàn)符合要求的調(diào)度機會,及分配給應(yīng)用刚照。如果直到最大次數(shù)還是沒有合適的節(jié)點資源刑巧,則放寬數(shù)據(jù)locality要求,退而求其次采用同一機架无畔。
最大opportunity數(shù)的配置啊楚,在Capacity Scheduler中使用yarn.scheduler.capacity.node-locality-delay配置,取值為正整數(shù)浑彰。Fair Scheduler略有不同恭理,配置的是yarn.scheduler.fair.lcality.threshold.node屬性,例如設(shè)為0.5郭变,代表要等待集群中一半的節(jié)點發(fā)送心跳提供scheduling opportunity颜价,才決定是否放寬要求采用同一機架上的其他節(jié)點涯保。對應(yīng)的yarn.scheduler.fair.lcality.threshold.rack配置放棄同一機架要求采用不同機架上的機器之前,需要等待多少節(jié)點發(fā)送心跳周伦。
延時調(diào)度參考資料:?原文:https://blog.csdn.net/bingduanlbd/article/details/52000151
7: capacity 和 fair Sechdule 兩種區(qū)別
? ? ?7.1 ?capacity 和 fair Sechdule的區(qū)別
兩者的調(diào)度策略不同:
參考資料:http://www.reibang.com/p/fa16d7d843af
在 Capacity Scheduler 中夕春,在比較資源占用率時,不同的資源比較器對資源定義是不一樣的横辆。默認(rèn)的是 DefaultResourceCalculator撇他,它只考慮內(nèi)存資源茄猫。另外一種是 DominantResourceCalculator狈蚤,采用了 DRF 比較算法,同時考慮內(nèi)存和 cpu 兩種資源划纽。通過參數(shù)yarn.scheduler.capacity.resource-calculator來設(shè)置脆侮。
Fair Scheduler 與 Capacity Scheduler 一樣也是依次選擇隊列、應(yīng)用勇劣,最后選擇 Container靖避,其中選擇隊列和應(yīng)用策略相同,采用了 FairShareComparator 比較器對隊列或者應(yīng)用程序進(jìn)行排序比默,然后從頭從頭開始選擇幻捏。
在介紹具體實現(xiàn)前還需介紹以下兩個定義:
最小共享量:管理員可給每個隊列配置一個最小共享量,調(diào)度器在分配資源時命咐,需要保證每個隊列中的作業(yè)至少獲取該數(shù)目的資源篡九。一個常見的應(yīng)用場景是,對產(chǎn)品隊列設(shè)置最小共享量醋奠,而測試隊列不設(shè)置榛臼,這樣,當(dāng)可用資源有限時時窜司,優(yōu)先保證產(chǎn)品隊列有資源可用沛善。
公平共享量:當(dāng)集群中存在多個隊列時,某些隊列中的資源可能用不了塞祈,這時候調(diào)度器會自動將這些隊列中剩余的資源共享給其他需要的隊列金刁,其他這些隊列獲取的共享資源多少主要由其隊列 weight決定,隊列 weight越大议薪,獲取的資源越多尤蛮。 一個隊列的最小共享量加上其獲取的共享資源數(shù)目,就是公平共享量笙蒙。
假設(shè)為 s1抵屿,s2,公平調(diào)度算法流程如下:
若 s1緊需資源(使用資源量小于最小資源保證即緊需資源)捅位,s2 緊需資源轧葛,把資源給 s1
若 s2緊需資源搂抒,s1 不緊需資源,把資源給 s2
若 s1尿扯、s2 都緊需資源求晶,把資源給 minShareRatio 更小的,minShareRatio1 = 已使用內(nèi)存/ 最小資源保證
若 s1衷笋、s2 都不緊需資源芳杏, 把資源給 useToWeightRatio 更小的, useToWeightRatio = 已使用內(nèi)存 / 權(quán)重
若 s1、s2 都不緊需資源且useToWeightRatio相同辟宗,把資源給更早啟動的
知道了比較算法爵赵,也就知道如何選出隊列和應(yīng)用程序了。選出應(yīng)用程序之后泊脐,選擇 Container 的邏輯與Capacity Scheduler 一致空幻。
7.2 ?capacity 和?fair Sechdule 搶占的區(qū)別
? ? ?capacity 和?fair Sechdule 都支持資源搶占。
? ? fair Sechdule
我們在yarn的管理頁面里面容客,經(jīng)筹躅酰可以看到隊列的Instantaneous Fair Share以及Steady Fair Share值.想要對Yarn的FairScheduler隊列資源管理、以及搶占規(guī)則有正確的理解缩挑,必須知道Yarn的Fair Share的含義
Steady FairShare是一個隊列的理想值但两,這個值是由集群資源和weigths計算出來的,并不會被經(jīng)常計算供置,只是在集群啟動或者集群的總資源發(fā)生增減的時候才會被重新計算谨湘。每個隊列的Steady FairShare的計算公式是`totalResources(集群總資源)/weights(所有隊列的weight總和)weight(某個隊列的weight)`*
Instantaneous FairShare計算集群中每個active隊列的FairShare。Steady FairShare是計算集群中所有的隊列士袄。這兩者的區(qū)別為:
空隊列也就是沒有分配任何資源的隊列不會計算Instantaneous FairShare悲关,其值為0。
如果集群中所有的隊列都是active娄柳,則Steady FairShare和Instantaneous FairShare相等寓辱。
每個隊列的Instantaneous FairShare的計算公式是`totalResources(集群總資源)/activeWeights(active隊列的weight總和)activeWeight(active隊列的weight)`*
搶占邏輯:
* 基于已經(jīng)計算好的需要搶占的資源(toPreempt()方法)進(jìn)行資源搶占。每一輪搶占赤拒,我們從root 隊列開始秫筏,
? * 一級一級往下進(jìn)行,直到我們選擇了一個候選的application.當(dāng)然挎挖,搶占分優(yōu)先級進(jìn)行这敬。
? * 依據(jù)每一個隊列的policy,搶占方式有所不同蕉朵。對于fair policy或者drf policy, 會選擇超過
? * fair share(這里的fair scheduler都是指Instantaneous Fair Share)
? * 最多的ChildSchedulable進(jìn)行搶占崔涂,但是,如果是fifo policy,則選擇最后執(zhí)行的application進(jìn)行
? * 搶占始衅。當(dāng)然冷蚂,同一個application往往含有多個container缭保,因此同一個application內(nèi)部container
? * 的搶占也分優(yōu)先級
yarn.scheduler.fair.waitTimeBeforeKill,默認(rèn)是15000ms蝙茶。等待時間超過此值時艺骂,將搶占隊列中的containerkill掉。
yarn.scheduler.fair.preemptionInterval隆夯,默認(rèn)是5000ms钳恕,兩次搶占檢查的時間間隔
7.3 ?container 被搶占kill的過程
1)為了盡可能避免資源浪費,YARN優(yōu)先選擇優(yōu)先級低的Container作為資源搶占對象蹄衷,且不會立刻殺死Container忧额,而是將釋放資源的任務(wù)留給應(yīng)用程序自己:ResourceManager將待殺死的Container列表發(fā)送給對應(yīng)的ApplicationMaster,以期望它采取一定的機制自行釋放這些Container占用的資源宦芦,比如先進(jìn)行一些狀態(tài)保存工作后宙址,再將對應(yīng)的Container殺死轴脐,以避免計算浪費调卑,如果一段時間后,ApplicationMaster尚未主動殺死這些Container大咱,則ResourceManager再強制殺死這些Container
2)NodeManager也可以在ResourceManager的指示下恬涧,殺掉Container。當(dāng)處于下面的幾種場景中時碴巾,NodeManager就可能Kill掉一個Container:
ResourceManager告訴它溯捆,Application已經(jīng)完成了
Scheduler決定搶占這個Container,并將它分配給另一個Application或者用戶
NodeManager檢測到厦瓢,這個Container使用的資源已經(jīng)超過了ContainerToken中指定的那些資源的限制
yarn.resourcemanager.scheduler.classorg.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler