大數(shù)據(jù)架構(gòu)師一定要弄清楚Fair Scheduler和Capacity Scheduler
1.項(xiàng)目背景
公司集群上千物理節(jié)點(diǎn),存儲(chǔ)容量100PB+,當(dāng)前使用50PB左右,YARN的計(jì)算內(nèi)存150Tb+,CPU 30000 Cores+。當(dāng)前使用的CDH集群,因?yàn)樾阅芷款i,需要遷移到自建的apache Hadoop3集群。CDH集群默認(rèn)的是Fair Scheduler,Ambari(Hortonwork)默認(rèn)使用Capacity Scheduler。CDH和HDP合并后,新的CDP會(huì)默認(rèn)使用Capacity Scheduler調(diào)度器。所以如果需要將CDH群集遷移到CDP時(shí),必須從Fair Scheduler遷移到Capacity Scheduler。遷移過(guò)程包括在遷移之前自動(dòng)將某些Fair Scheduler配置轉(zhuǎn)換為Capacity Scheduler配置,并在遷移之后進(jìn)行手動(dòng)微微調(diào)。
目前Hadoop3.x默認(rèn)使用的是Capacity Scheduler,并且Capacity Scheduler支持了Node Labels機(jī)制,即通過(guò)給節(jié)點(diǎn)打標(biāo)簽的形式,讓不同隊(duì)列使用不同的標(biāo)簽節(jié)點(diǎn)進(jìn)而更好地做計(jì)算資源隔離和資源保障。目前大公司來(lái)說(shuō)使用Capacity Scheduler和Fair Scheduler的公司都有很多。至于FIFO調(diào)度器在生產(chǎn)上的使用幾乎可以忽略不計(jì)。對(duì)于一家公司,中型集群規(guī)模的話,到底是選擇Capacity Scheduler還是Fair Scheduler呢?從配置使用友好度,日常管理,生產(chǎn)上資源分配,拓展,實(shí)際使用經(jīng)驗(yàn)等多個(gè)維度去考核對(duì)比一下兩者的聯(lián)系
2.Fair Scheduler和Capacity Scheduler的調(diào)研
現(xiàn)在隨著hadoop3的更新,F(xiàn)air Scheduler和Capacity Scheduler的功能性越來(lái)越同質(zhì)化,相近。但是兩者的之所以沒(méi)有合并或者湮沒(méi)一家,是因?yàn)楸举|(zhì)上還是不同,都有一些自己的特質(zhì)與特定的功能,在不同方向發(fā)揮著自己的余熱。下面基于其重要的特性做了一些對(duì)比。
編號(hào) | 比較類別 | Fair Scheduler | Capacity Scheduler |
1 | 是否支持多租戶的使用 | 支持 | 支持 |
2 | 是否支持多隊(duì)列的資源管理,支持隊(duì)列的樹(shù)狀結(jié)構(gòu)以及子隊(duì)列 | 支持 都可以配置多個(gè)父隊(duì)列,每個(gè)父隊(duì)列下多個(gè)子隊(duì)列 同一個(gè)父隊(duì)列下的子隊(duì)列資源分配值加起來(lái)可以不等于父隊(duì)列,這樣有利于提高父隊(duì)列的資源利用率。但是實(shí)際使用最大小值會(huì)受父類的限制。 | 支持 都可以配置多個(gè)父隊(duì)列,每個(gè)父隊(duì)列下多個(gè)子隊(duì)列 同一個(gè)父隊(duì)列下的同一級(jí)別的子隊(duì)列Capacity之和必須為100,比較麻煩。 |
3 | 支持隊(duì)列的最小資源保障 | 支持 可以配置隊(duì)列的最小資源,舊的格式支持固定值,新的配置格式支持百分比;vcores = X,memory-mb = Y”或“ vcores = X%,memory-mb = Y%。 同一級(jí)別的容量之和加起來(lái)可以超過(guò)100% 分配文件必須為XML格式 | 支持, 默認(rèn)配置百分比值或者小數(shù) 同一級(jí)別隊(duì)列的容量總和必須100或者100% 比如30,表示占父隊(duì)列的資源總和的30%。 尖叫提示: 不管是Fair Scheduler和Capacity Scheduler,如果當(dāng)前隊(duì)列沒(méi)有任務(wù)提交時(shí),是不會(huì)分配最小資源的,這個(gè)時(shí)候不保障最小資源,都是0。 如果該隊(duì)列有任務(wù)提交時(shí),需要等待當(dāng)前集群釋放資源時(shí),才會(huì)分配滿足最小資源的保證。也就說(shuō)只有有任務(wù)跑時(shí)才會(huì)滿足最小資源。 注意:當(dāng)一個(gè)隊(duì)列多個(gè)用戶提交使用時(shí),只保證整個(gè)隊(duì)列的最小資源使用,不保證每個(gè)用戶是否能有最小資源保證 默認(rèn)資源分配都是以內(nèi)存為調(diào)度單位的,但都支持CPU+內(nèi)存 |
4 | 支持隊(duì)列的最大資源限制 | 支持 配置格式同上,最小資源保障的配置。 尖叫提示:不管是Fair Scheduler和Capacity Scheduler隊(duì)列的最大資源限制是隊(duì)列可以使用的資源最大值,無(wú)論如何都不會(huì)超過(guò)這個(gè)值。 同樣,如果父隊(duì)列有最大值的限制,則子隊(duì)列使用的資源總和不會(huì)超過(guò)父隊(duì)列的最大值。也說(shuō)明了每個(gè)用戶的最大資源使用是有限制的。 | 支持, 默認(rèn)配置百分比值或者小數(shù) 同一級(jí)別隊(duì)列的容量總和必須100或者100% 比如30,表示占父隊(duì)列的資源總和的30%。 |
5 | 隊(duì)列之間資源共享與搶占 | 支持 當(dāng)集群中有隊(duì)列資源空閑時(shí),其他供其他隊(duì)列搶占使用,這是FS的重要特質(zhì) | 支持 當(dāng)集群中有隊(duì)列資源空閑時(shí),其他供其他隊(duì)列搶占使用,CP的搶占管理更加精細(xì)化,相比配置也更加麻煩。 |
6 | 支持隊(duì)列內(nèi)為不同隊(duì)列配置不同的調(diào)度策略 | 支持 默認(rèn)是基于內(nèi)存的Fair share,也支持FIFO,以及多資源調(diào)度策略 | 不支持 |
7 | 支持限制隊(duì)列內(nèi)某個(gè)用戶的最大資源使用量 | 不支持 尖叫提示: Capacity Scheduler支持限制隊(duì)列中每個(gè)用戶可以使用多少資源。這樣可以避免一個(gè)用戶接管集群中的所有資源。 | 支持 可以通過(guò)配置參數(shù),限制單個(gè)用戶使用隊(duì)列最大資源的百分比,防止單個(gè)用戶獨(dú)占整個(gè)隊(duì)列資源 |
8 | 支持負(fù)載均衡機(jī)制 | 支持 Fair Schedule的負(fù)載均衡機(jī)制會(huì)將集群中的任務(wù)盡可能的分配到各個(gè)節(jié)點(diǎn)上 | 不支持 |
9 | 資源分配策略 | FAIR,FIFO或者DRF | FIFO或者DRF,默認(rèn)FIFO |
10 | 支持任務(wù)搶占調(diào)度 | 支持 FS的搶占比較簡(jiǎn)單,直接計(jì)算權(quán)重比,所以可以任意配置整數(shù)權(quán)重值。 | 支持 |
11 | 隊(duì)列的ACL權(quán)限控制 | 支持 | 支持 |
12 | 限制隊(duì)列或集群的最大并發(fā)Appplication的個(gè)數(shù) | 支持 | 支持 yarn.scheduler.capacity.root.yarn_mobdi_prd.maximum-applications 尖叫提示:區(qū)別是Fair Scheduler調(diào)度,超出最大并發(fā)數(shù)比如40后,其他任務(wù)處理等待狀態(tài);而Capacity Scheduler超出后任務(wù)直,拒絕申請(qǐng),拋出異常超出最大application的限制 |
13 | 限制基于用戶的最大并發(fā)Appplication的個(gè)數(shù) | 支持 | 不支持 |
14 | 限制AppMaster在隊(duì)列/集群中最大資源使用 | 支持 | 支持 尖叫提示:這個(gè)限制的好處是防止集群中運(yùn)行了很多APPMaster,也就是初始化了很多任務(wù),因?yàn)楸举|(zhì)上APPMaster就是一個(gè)container。進(jìn)而沒(méi)有資源給真正的計(jì)算任務(wù)運(yùn)行,造成大量任務(wù)處于饑餓狀態(tài)。 |
15 | 是否支持動(dòng)態(tài)刷新配置文件 | 支持 | 支持 尖叫提示:刷新資源配置文件后,如增加隊(duì)列,調(diào)整資源分配,比重,無(wú)需重啟,一般10s后自動(dòng)加載生效 |
16 | 是否支持Node Label | 不支持 | 支持 尖叫提示:Node Label節(jié)點(diǎn)分區(qū)是一種基于硬件/用途將大型群集劃分為幾個(gè)較小的群集的方法。容量和ACL可以添加到分區(qū)。 |
17 | 是否支持動(dòng)態(tài)調(diào)整container的大小 | 不支持 | 支持 yarn.resourcemanager.auto-update.containers默認(rèn)值是false,應(yīng)用程序可以根據(jù)工作負(fù)載的變化來(lái)更新其正在運(yùn)行的容器的大小。不會(huì)殺死任務(wù)。 尖叫提示:敲黑板!單個(gè)container使用的最大資源不會(huì)超過(guò)機(jī)器分配NM的最大值 |
18 | 規(guī)整化因子,很重要 | 支持,F(xiàn)S內(nèi)置了資源規(guī)整化算法,它規(guī)定了最小可申請(qǐng)資源量、最大可申請(qǐng)資源量和資源規(guī)整化因子,如果應(yīng)用程序申請(qǐng)的資源量小于最小可申請(qǐng)資源量,則YARN會(huì)將其大小改為最小可申請(qǐng)量;如果應(yīng)用程序申請(qǐng)的資源量大于最大可申請(qǐng)資源量,則會(huì)拋出異常,無(wú)法申請(qǐng)成功;yarn.scheduler.increment-allocation-mb和yarn.scheduler.increment-allocation-vcores 比如:YARN的container最小資源內(nèi)存量為3G,規(guī)整因子是512Mb,如果一個(gè)應(yīng)用程序申請(qǐng)3.2G內(nèi)存,則會(huì)得到3.5內(nèi)存。 | 不支持, 動(dòng)態(tài)規(guī)劃因子。比如:YARN的container最小資源內(nèi)存量為3G,規(guī)整因子是512Mb,如果一個(gè)應(yīng)用程序申請(qǐng)3.5G內(nèi)存,則會(huì)得到6G內(nèi)存。Fair Scheduler的資源增加是最小資源的整數(shù)倍。相比FS更加可以提高資源的利用率。 |
19 | 配置方式 | Fair Scheduler使用嵌套的xml配置來(lái)模仿隊(duì)列的層次結(jié)構(gòu),比傳統(tǒng)的Hadoop風(fēng)格的配置更加直觀 | 通過(guò).的形式配置a.b.c 尖叫提示:相比后者,F(xiàn)air Scheduler使用的配置更加方便,直觀,好吧就是簡(jiǎn)單。 |
20 | 數(shù)據(jù)局部特性 | 支持 數(shù)據(jù)本地計(jì)算策略的百分比 yarn.scheduler.fair.locality.threshold.node yarn.scheduler.fair.locality.threshold.rack 默認(rèn)值是-1,0表示不放棄任何調(diào)度機(jī)會(huì)。正常值配置在0-1之間。 | 支持 Capacity Scheduler利用“延遲調(diào)度”來(lái)遵守任務(wù)局部性約束。有3個(gè)級(jí)別的位置限制:節(jié)點(diǎn)本地,機(jī)架本地和關(guān)閉交換機(jī)。當(dāng)無(wú)法滿足地點(diǎn)要求時(shí),調(diào)度程序會(huì)計(jì)算錯(cuò)過(guò)的機(jī)會(huì)的數(shù)量,并等待此計(jì)數(shù)達(dá)到閾值,然后再將地點(diǎn)約束放寬到下一個(gè)級(jí)別 尖叫提示:這個(gè)對(duì)于任務(wù)本地化的控制有用,尤其對(duì)于帶寬緊張的集群。 |
3.最后的最后
3.1 Fair Scheduler
- Fair Scheduler是資源池概念,大家共享這個(gè)池子里面的資源。
- 多隊(duì)列多租戶使用時(shí),可以根據(jù)業(yè)務(wù)線,部門,隊(duì)列的實(shí)際使用情況,根據(jù)每個(gè)隊(duì)列的日均最小使用資源給隊(duì)列配置一個(gè)min resource,保證這個(gè)隊(duì)列的任務(wù)可以滿足最低運(yùn)行需求。同時(shí)為了防止單個(gè)隊(duì)列過(guò)多占用集群的資源,可以通過(guò)設(shè)置max resource限制隊(duì)列使用資源上線。但是max resource謹(jǐn)慎使用,設(shè)置不合理可能降低集群的資源使用率。
- 在滿足了不同隊(duì)列最小使用資源的保障后,再根據(jù)實(shí)際應(yīng)用場(chǎng)景,給不同的隊(duì)列配置不同的權(quán)重,最后FS會(huì)根據(jù)權(quán)重來(lái)為各個(gè)對(duì)列的資源池(各個(gè)對(duì)列還有子隊(duì)列)分配資源(這種搶占的按照權(quán)重分配的方式本質(zhì)和capacity 分配一樣)。權(quán)重的設(shè)置相對(duì)capacitye很靈活,想增加權(quán)重直接修改權(quán)重整數(shù)值即可,F(xiàn)S會(huì)將各個(gè)對(duì)列的權(quán)重值求和。用當(dāng)前隊(duì)列權(quán)重值/總和的形式分配資源,其實(shí)也就是按所占的百分比分配資源。這種方式有利于動(dòng)態(tài)調(diào)整資源池的使用。同一級(jí)別的隊(duì)列可以設(shè)置權(quán)重進(jìn)行資源分配搶占。同一個(gè)父隊(duì)列的子隊(duì)列之間的資源也可以通過(guò)配置權(quán)重來(lái)進(jìn)行資源分配搶占,注意子隊(duì)列只搶占父隊(duì)列的資源。
- 如下,隊(duì)列的生產(chǎn)配置情況??梢酝ㄟ^(guò)權(quán)重,限制并發(fā),最小資源,最大資源,調(diào)度策略等方式保證隊(duì)列任務(wù)的穩(wěn)定調(diào)度。
- 可以結(jié)合公司實(shí)際不同部門的資源使用情況,比如A部門主要晚上用,B部門主要夜里用,配置早晚兩套或者N套資源隊(duì)列分配配置文件,通過(guò)調(diào)度自動(dòng)更新配置文件,yarn會(huì)每隔10s去更新讀取一次配置文件,這樣在無(wú)感知的情況下更加有利于調(diào)高集群的吞吐率。
3.2 Capacity Scheduler
- 相比Capacity Scheduler 是一個(gè)隊(duì)列概念,新增一個(gè)任務(wù),如果發(fā)現(xiàn)資源不夠了,則根據(jù)FIFO規(guī)則排隊(duì);什么時(shí)候資源夠了,再用。
- Fair Scheduler可以配置自動(dòng)創(chuàng)建pool,但是Capacity則無(wú)法創(chuàng)建隊(duì)列;其實(shí)本質(zhì)差別就是在于一個(gè)是pool共享資源的概念。對(duì)于FS而言,可以使用資源池中未被使用的資源,但是Capacity則不允許;所以前者比較靈活,后者相對(duì)呆滯。
3.3 建議
如果是中小型集群,上千節(jié)點(diǎn)以內(nèi),資源比較緊張,建議使用Fair Scheduler,配置簡(jiǎn)單,對(duì)資源的使用效率也高。相比Fair Scheduler更加靈活,允許作業(yè)使用群集中未使用的資源。它通過(guò)基于定義的權(quán)重來(lái)給任務(wù)的公平搶占和穩(wěn)定提供保證。對(duì)于中小型集群,這是一個(gè)很好的默認(rèn)設(shè)置。
容量調(diào)度程序?qū)τ谫Y源的管理更加細(xì)化,配置起來(lái)也是調(diào)度器中最麻煩的。其使用資源配額定義隊(duì)列。作業(yè)不能消耗額外的資源。這需要更多的配置和不斷的試錯(cuò),調(diào)整容量規(guī)劃。所以它更加適合不同工作負(fù)載且具有不同需求的大型集群。比如大幾千,上萬(wàn),類似阿里巴巴那樣的集群。
參考資料:
https://docs.cloudera.com/cdp/latest/data-migration/topics/cdp-data-migration-yarn-scheduler-migration.html
Apache Hadoop 3.3.4 – YARN Node Labels
本文轉(zhuǎn)載自微信公眾號(hào)「滌生大數(shù)據(jù)」,作者「滌生大數(shù)據(jù)」,可以通過(guò)以下二維碼關(guān)注。
轉(zhuǎn)載本文請(qǐng)聯(lián)系「滌生大數(shù)據(jù)」公眾號(hào)。