1. 程式人生 > >利用yarn多佇列實現hadoop資源隔離

利用yarn多佇列實現hadoop資源隔離

大資料處理離不開hadoop叢集的部署和管理,對於本來硬體資源就不多的創業團隊來說,做好資源的共享和隔離是很有必要的,畢竟不像BAT那麼豪,那麼怎麼樣能把有限的節點同時分享給多組使用者使用而且互不影響呢,我們來研究一下yarn多佇列做資源隔離

請尊重原創,轉載請註明來源網站www.shareditor.com以及原始連結地址

CapacityScheduler

使用過第一代hadoop的同學應該比較熟悉mapred.job.map.capacity/mapred.job.reduce.capacity這個引數,無論是map還是reduce都可以配置capacity(也就是併發數),表示同時可以有多少個map(或reduce)執行,通過這個引數可以限制一個任務同時佔用的資源(節點)數,這樣不至於影響其他任務的執行。

在這裡有人會問:我把任務的priority設定成VERY LOW不就行了嗎?其實這樣在某些場景下不能解決全部問題,因為假如你一個VERY LOW的任務剛啟動時沒有其他人的任務,那麼會先佔用所有節點,如果你的每一個task執行時間都是1天,那麼其他任務就算優先順序再高也只能傻等一天,所以才有必要做資源隔離

第二代hadoop因為使用yarn做資源管理,沒有了槽位的概念,所以就沒有了capacity。但是在yarn中專門有了CapacityScheduler這個元件。這是一個可插裝的排程器,它的用途就是對多使用者實現共享大叢集並對每個使用者資源佔用做控制

對於很豪的公司來說,每個使用者(團隊)自己有一個hadoop叢集,這樣可以提高自身的穩定性和資源供應,但是確降低了資源利用率,因為很多叢集大多數時間都是空閒的。CapacityScheduler能實現這樣的功能:每個組固定享有叢集裡的一部分資源,保證低保,同時如果這個固定的資源空閒,那麼可以提供給其他組來搶佔,但是一旦這些資源的固定使用者要用,那麼立即釋放給它使用。這種機制在實現上是通過queue(佇列)來實現的。當然CapacityScheduler還支援子佇列(sub-queue),

hadoop資源分配的預設配置

我在部落格中已經描述了整體一套hadoop搭建的方法。那麼在搭建完成後我們發現對於資源分配方面,yarn的預設配置是這樣的

也就是有一個預設的佇列

事實上,是否使用CapacityScheduler元件是可以配置的,但是預設配置就是這個CapacityScheduler,如果想顯式配置需要修改 conf/yarn-site.xml 內容如下:

<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
</value
>
</property>

上面圖中標明瞭預設佇列是default,是使用了CapacityScheduler的預設配置

我們看一下有關這裡的default是怎麼配置的,見capacity-scheduler.xml配置:

<property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default</value>
    <description>
      The queues at the this level (root is the root queue).
    </description>
  </property>

這裡的配置項格式應該是yarn.scheduler.capacity.<queue-path>.queues,也就是這裡的root是一個queue-path,因為這裡配置了value是default,所以root這個queue-path只有一個佇列叫做default,那麼有關default的具體配置都是形如下的配置項:

yarn.scheduler.capacity.root.default.capacity:一個百分比的值,表示佔用整個叢集的百分之多少比例的資源,這個queue-path下所有的capacity之和是100

yarn.scheduler.capacity.root.default.user-limit-factor:每個使用者的低保百分比,比如設定為1,則表示無論有多少使用者在跑任務,每個使用者佔用資源最低不會少於1%的資源

yarn.scheduler.capacity.root.default.maximum-capacity:彈性設定,最大時佔用多少比例資源

yarn.scheduler.capacity.root.default.state:佇列狀態,可以是RUNNING或STOPPED

yarn.scheduler.capacity.root.default.acl_submit_applications:哪些使用者或使用者組可以提交人物

yarn.scheduler.capacity.root.default.acl_administer_queue:哪些使用者或使用者組可以管理佇列

當然我們可以繼續以root.default為queue-path建立他的子佇列,比如:

<property>
    <name>yarn.scheduler.capacity.root.default.queues</name>
    <value>a,b,c</value>
    <description>
      The queues at the this level (root is the root queue).
    </description>
  </property>

這是一個樹結構,一般和公司的組織架構有關

配置好上述配置後執行

yarn rmadmin -refreshQueues

生效後發現yarn佇列情況類似下面的樣子(配置了兩個佇列:research和default):

如果希望自己的任務排程到research佇列,只需在啟動任務時指定:mapreduce.job.queuename引數為research即可