轉載: https://www.iteblog.com/archives/1536.html
本文将介紹Hadoop YARN提供的三種任務排程政策:FIFO Scheduler,Capacity Scheduler 和 Fair Scheduler。
FIFO Scheduler
顧名思義,這就是先進先出(first in, first out)排程政策,所有的application将按照送出的順序來執行,這些 application 都放在一個隊列裡,隻有在執行完一個之後,才會繼續執行下一個。
這種排程政策很容易了解,但缺點也很明顯。耗時的長任務會導緻後送出的任務一直處于等待狀态,如果這個叢集是多人共享的,顯然不太合理。是以 YARN 提供了另外兩種排程政策,更加适合共享叢集。下圖的第一副小圖是FIFO Scheduler 執行過程的示意圖:
文章目錄
- 1 Capacity Scheduler
- 1.1 隊列放置
- 2 Fair Scheduler
- 2.1 開啟 Fair Scheduler
- 2.2 隊列設定
Capacity Scheduler
前面的FIFO排程政策隻适合一個人,而且資源的使用率不是很高。基于這些原因,多人共享的排程器出現了,Capacity Scheduler就是其中一個。Capacity Scheduler為每個人配置設定一個隊列,每個隊列占用的叢集資源是固定的,但是可以不同,隊列内部還是采用FIFO排程的政策。上圖的第二幅小圖是Capacity Scheduler 執行過程的示意圖。
可以看到,隊列 A 和 B 享有獨立的資源,但是 A 所占的資源比重更多。如果任務在被執行的時候,叢集恰好有空閑資源,比如隊列 B 為空,那麼排程器就可能配置設定更多的資源給隊列 A,以更好地利用空閑資源。這種處理方式被叫做「queue elasticity」(彈性隊列)。
但是彈性隊列也有一些副作用,如果此時隊列 B 有了新任務,之前被隊列 A 占用的資源并不會立即釋放,隻能等到隊列 A 的任務執行完。為了防止某個隊列過多占用叢集資源,YARN 提供了一個設定可以控制某個隊列能夠占用的最大資源。但這其實又是跟彈性隊列沖突的,是以這裡有一個權衡的問題,這個最大值設為多少需要不斷試驗和嘗試。
Capacity Scheduler 的隊列是支援層級關系的,即有子隊列的概念。對于如下層次結構的隊列:
root
├── prod
└── dev
├── eng
└── science
下面是一個示例配置檔案:
|
所有隊列的根隊列叫做 root,這裡一共有兩個隊列:dev 和 prod,dev 隊列之下又有兩個子隊列:eng 和 science。dev 和 prod 分别占用了 60% 和 40% 的資源比重,同時限制了 dev 隊列能夠伸縮到的最大資源比重是 75%,換句話說,prod 隊列至少能有 25% 的資源配置設定。eng 和 science 隊列各占 50%,但因為沒有設定最大值,是以有可能出現某個隊列占用整個父隊列資源的情況。
除了設定隊列層級關系和資源配置設定比重之外,Capacity Scheduler 還提供了諸如控制每個使用者或者任務最大占用資源、同時執行的最大任務數,以及隊列的 ACL 等配置,詳細請參考官方文檔。
隊列放置
配置設定好了隊列,要怎麼控制任務在指定隊列執行呢?如果是 MapReduce 程式,那麼可以通過
mapreduce.job.queuename
來設定執行隊列,預設情況是在 default 隊列執行。注意指定的隊列名不需要包含父隊列,即不能寫成 root.dev.eng,而應該寫 eng。
Fair Scheduler
Fair Scheduler 試圖為每個任務均勻配置設定資源,比如目前隻有任務 1 在執行,那麼它擁有整個叢集資源,此時任務 2 被送出,那任務 1 和任務 2 将平分叢集資源,以此類推。
當然 Fair Scheduler 也支援隊列的概念,上圖的第三幅是執行過程的示意圖。隊列 A 首先執行任務,任務 1 擁有整個叢集資源,随後隊列 B 增加任務 2,這兩個隊列按照配置規則擷取不同的資源,接着任務2運作完,任務1又擁有整個叢集的資源。
開啟 Fair Scheduler
設定
yarn.resourcemanager.scheduler.class
為
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
(在 yarn-site.xml),如果你使用的是 CDH,那預設就是 Fair Scheduler(事實上,CDH 也不支援 Capacity Scheduler)。
隊列設定
Fair Scheduler 通過 fair-scheduler.xml 檔案來進行各種設定,這個檔案的位置可以通過
yarn.scheduler.fair.allocation.file
屬性來控制(在 yarn-site.xml)。如果沒有這個檔案,Fair Scheduler 采取的政策将是:每個任務都放在以目前使用者命名的隊列中,如果這個隊列不存在,将會自動建立。
Fair Scheduler 也支援顯式定義隊列,就像 Capacity Scheduler 那樣,下面是示例檔案:
|
這裡自定義了兩個隊列:prod 和 dev,權重比是 40:60,也就是說不采用均分的政策。每個隊列可以有不同的排程政策,預設都是 fair,此外還有 FIFO、Dominant Resource Fairness, 詳細的配置資訊可以檢視官方文檔