天天看點

Hadoop yarn任務排程政策介紹

轉載:  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 執行過程的示意圖:

Hadoop yarn任務排程政策介紹

文章目錄

  • 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
      

下面是一個示例配置檔案:

<?

xml

version

=

"1.0"

?>

<

configuration

>

  <

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

>

  <

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

>

  所有隊列的根隊列叫做 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 那樣,下面是示例檔案:

< ?

xml

version

=

"1.0"

?>

<

allocations

>

  <

defaultqueueschedulingpolicy

>fair</

defaultqueueschedulingpolicy

>

<

queue

name

=

"prod"

>

  <

weight

>40</

weight

>

  <

schedulingpolicy

>fifo</

schedulingpolicy

>

</

queue

>

<

queue

name

=

"dev"

>

  <

weight

>60</

weight

>

</

queue

>

<

queue

name

=

"eng"

></

queue

>

<

queue

name

=

"science"

></

queue

>

<

queueplacementpolicy

>

  <

rule

name

=

"specified"

create

=

"false"

></

rule

>

  <

rule

name

=

"primaryGroup"

create

=

"false"

></

rule

>

  <

rule

name

=

"default"

queue

=

"dev.eng"

></

rule

>

</

queueplacementpolicy

>

</

allocations

>

  這裡自定義了兩個隊列:prod 和 dev,權重比是 40:60,也就是說不采用均分的政策。每個隊列可以有不同的排程政策,預設都是 fair,此外還有 FIFO、Dominant Resource Fairness, 詳細的配置資訊可以檢視官方文檔

繼續閱讀