YARN中的任務隊列調度器-公平調度器(Fair Scheduler)

一、概述

    公平調度器可以爲所有的應用“平均公平”分配資源,當然,這種“公平”是可以配置的,稱爲權重,可以在分配文件中爲每一個隊列設置分配資源的權重,如果沒有設置,默認是1(由於默認權重相同,因此,在不做配置的情況下,作業(隊列)之間的資源佔比相同)。

    默認地,所有的應用程序在一段時間內平均獲得相等的資源份額;

    默認地,公平調度程序僅基於內存調度公平決策,當然,這種策略也是支持配置的。

    其策略如下圖所示:

    紫色區域代表任務A, 綠色區域代表任務B,當只有一個應用程序(A)在運行時,該應用程序將使用整個集羣的資源(0  ~ t1時間段)。當提交其他應用程序時(t1時刻),A釋放的資源被分配給新應用程序,因此每個應用程序最終得到的資源大致相同(在默認情況下)。當任務B執行完後(t2時刻),B所佔用的資源又會被A使用,此後A又將完全佔用集羣資源直至任務結束。

    相比較容量調度器,公平調度器並不會爲某個隊列預留資源,調度器會在所有正在運行的作業之間動態平衡集羣資源。公平調度器的這種機制不光實現應用之間的公平分配資源,也可以實現在多隊列之間,因爲公平調度器也支持多層級隊列。但是公平規則只限於同級隊列。例如:默認配置下,隊列A、B,A啓動一個作業,此時A佔用100%資源,過一段時間,B隊列啓動一個作業b1,而後A、B將平分資源,各佔50%,如果此時B隊列又啓動了一個作業b2,那麼b1、b2將各佔隊列B的50%資源,即a1作業佔系統資源的50%,b1、b2各佔系統資源的25%。

二、配置

1. 指定調度器

位置:$HADOOP_HOME/etc/hadoop/yarn-site.xml

添加配置:

    key: yarn.resourcemanager.scheduler.class

    value: org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

2. 定義分配文件

位置:$HADOOP_HOME/etc/hadoop/fair-scheduler.xml

隊列結構:

(root)

    --general

    --dev

        --mr

        --azkaban

隊列元素使用<queue/>來定義,權重使用其子元素<weight/>定義,上面的結構在配置文件中如下:

  <queue name="general">
    <weight>2</weight>
    <schedulingPolicy>fifo</schedulingPolicy>
  </queue>

  <queue name="dev">
    <weight>8</weight>
    <queue name="mr"></queue>
    <queue name="azkaban"></queue>
    <schedulingPolicy>drf</schedulingPolicy>
  </queue>

    該配置文件中,隊列general佔用資源權重20%,dev隊列佔用權重80%,也就是說,如果集羣資源分配比例是1:4,那麼此時就認爲是公平的。對於dev的子隊列mr和azkaban,由於沒有分配權重,因此默認都是1,也就是說,mr和azkaban隊列平分dev的資源。

    每個隊列可以擁有自己的調度策略,可選值又fifo、fair(默認)、drf,可以使用<queue/>的子元素<schedulingPolicy/>定義。

    和容量調度器相同,公平調度器也可以配置最大(<queue/>子元素<maxResources/>)、最小資源(<queue/>子元素<minResources/>)以及最大可運行應用數量(<queue/>子元素<maxRunningApps/>),其中最小資源可以確保特定用戶、羣組或生產應用程序總能獲取到足夠的資源時是很有用的。當一個資源池包含作業時,它至少能獲取到它的最小共享資源,但是當資源池不完全需要它所擁有的保證共享資源時,額外的部分會在其它資源池間進行切分(摘自 hadoop2配置公平調度器)。

    配置好後,進入YARN的控制檯,如圖所示:

三、隊列放置

  不同於容量調度器,公平調度器設計了一個基於規則的系統來爲作業分配調度隊列,它內置了一套規則可以插拔式的配置。定義分配規則使用<queuePlacementPolicy/>標籤,具體條件使用<rule/>定義,例如:

  <queuePlacementPolicy>
    <rule name="specified" create="false"></rule>
    <rule name="primaryGroup" create="false"></rule>
    <rule name="user" create="false"></rule>
    <rule name="default" queue="general"></rule>
  </queuePlacementPolicy>

    我們可以將<rule>視爲web中的過濾器,當對作業進行分配的時候,系統會從上到下一次匹配,例如上面的配置,specified表示在提交作業的時候指定了隊列,primaryGroup指的是用戶所在unix用戶組(組名)的隊列,user值得是用戶名爲命名的隊列,default規則是兜底規則,若以上都不匹配,則放到general隊列。

    create屬性指定是,若匹配到已經存在的隊列,則將作業放到改隊列,若匹配不到已經存在的隊列,則根據create來選擇是否創建隊列,默認值是true。例如,若<rule name="user" create=true/>,此時用戶user1提交作業,調度器就會尋找是否又名字爲user1的隊列,若沒有,就會創建名字爲user1的隊列,並將這個作業放到該隊列中。

    若不顯示地配置<queuePlacementPolicy/>,則調度器將使用如下默認的配置:

  <queuePlacementPolicy>
    <rule name="specified"></rule>
    <rule name="user"></rule>
  </queuePlacementPolicy>

    也就是說,除非顯示地指明所用隊列,否則按照提交作業的用戶名爲名加入隊列中。

四、搶佔

    與容量調度器不通,公平調度器擁有搶佔機制。當提交一個作業的時候,如果資源緊張,則作業會等待其他作業資源釋放後再執行,這個等待時間可以使用搶佔功能進行控制。

    搶佔指的是,調度器允許終止哪些佔用資源高於公平狀態下應分配的資源,從而釋放資源給哪些佔用資源小於公平狀態下應分配資源的作業。
1. 開啓搶佔模式:

yarn.scheduler.fair.preemption=true

2. 搶佔機制主要設置:

最小共享:指的是在這個時間內,沒有獲得設置的最小資源值,則會搶佔其他容器資源。

  配置:

    方式1:頂層元素<defaultMinSharePreemptionTimeout/>,單位秒,可以爲所有隊列設置。

    方式2:<queue/>子元素<minSharePreemptionTimeout>,單位秒,單獨爲某個隊列設置。

  顯而易見,該種方式需要隊列的最小資源設置配合。

公平共享:指的是在這個時間內,沒有獲得公平狀態下的資源值的一半,則搶佔其他容器資源。

  配置:

    方式1:頂層元素<defaultFairSharePreemptionTimeout/>,單位秒,可以爲所有隊列設置。

    方式2:<queue/>子元素<fairSharePreemptionTimeout>,單位秒,單獨爲某個隊列設置。

    需要注意的是,搶佔功能本身雖然會減少作業執行的延遲時間,但是會降低整個集羣的效率,因爲被搶佔的作業會終止運行,最終會重新開始執行。

五、總結

公平調度器實現了較高的集羣利用率,同時保證小作業能即使完成。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章