大數據之Yarn——Capacity調度器概念以及配置

試想一下,你如今所在的公司有一個hadoop的集羣。可是A項目組常常作一些定時的BI報表,B項目組則常用一些軟件作一些臨時需求。那麼他們確定會遇到同時提交任務的場景,這個時候到底如何分配資源知足這兩個任務呢?是先執行A的任務,再執行B的任務,仍是同時跑兩個?html

若是你存在上述的困惑,能夠多瞭解一些yarn的資源調度器。node

在Yarn框架中,調度器是一塊很重要的內容。有了合適的調度規則,就能夠保證多個應用能夠在同一時間有條不紊的工做。最原始的調度規則就是FIFO,即按照用戶提交任務的時間來決定哪一個任務先執行,可是這樣極可能一個大任務獨佔資源,其餘的資源須要不斷的等待。也可能一堆小任務佔用資源,大任務一直沒法獲得適當的資源,形成飢餓。因此FIFO雖然很簡單,可是並不能知足咱們的需求。web

yarn默認還提供了兩種調度規則,capacity和fair share。本篇就主要介紹下capacity調度器:apache

什麼是capacity調度器

Capacity調度器說的通俗點,能夠理解成一個個的資源隊列。這個資源隊列是用戶本身去分配的。好比我大致上把整個集羣分紅了AB兩個隊列,A隊列給A項目組的人來使用。B隊列給B項目組來使用。可是A項目組下面又有兩個方向,那麼還能夠繼續分,好比專門作BI的和作實時分析的。那麼隊列的分配就能夠參考下面的樹形結構:安全

root
------a[60%]
      |---a.bi[40%]
      |---a.realtime[60%]
------b[40%]

a隊列佔用整個資源的60%,b隊列佔用整個資源的40%。a隊列裏面又分了兩個子隊列,同樣也是2:3分配。app

雖然有了這樣的資源分配,可是並非說a提交了任務,它就只能使用60%的資源,那40%就空閒着。只要資源實在空閒狀態,那麼a就可使用100%的資源。可是一旦b提交了任務,a就須要在釋放資源後,把資源還給b隊列,直到ab平衡在3:2的比例。框架

粗粒度上資源是按照上面的方式進行,在每一個隊列的內部,仍是按照FIFO的原則來分配資源的。oop

特性

capacity調度器具備如下的幾個特性:ui

  • 層次化的隊列設計,這種層次化的隊列設計保證了子隊列可使用父隊列設置的所有資源。這樣經過層次化的管理,更容易合理分配和限制資源的使用。
  • 容量保證,隊列上都會設置一個資源的佔比,這樣能夠保證每一個隊列都不會佔用整個集羣的資源。
  • 安全,每一個隊列又嚴格的訪問控制。用戶只能向本身的隊列裏面提交任務,並且不能修改或者訪問其餘隊列的任務。
  • 彈性分配,空閒的資源能夠被分配給任何隊列。當多個隊列出現爭用的時候,則會按照比例進行平衡。
  • 多租戶租用,經過隊列的容量限制,多個用戶就能夠共享同一個集羣,同事保證每一個隊列分配到本身的容量,提升利用率。
  • 操做性,yarn支持動態修改調整容量、權限等的分配,能夠在運行時直接修改。還提供給管理員界面,來顯示當前的隊列情況。管理員能夠在運行時,添加一個隊列;可是不能刪除一個隊列。管理員還能夠在運行時暫停某個隊列,這樣能夠保證當前的隊列在執行過程當中,集羣不會接收其餘的任務。若是一個隊列被設置成了stopped,那麼就不能向他或者子隊列上提交任務了。
  • 基於資源的調度,協調不一樣資源需求的應用程序,好比內存、CPU、磁盤等等。

關於調度器的配置

配置調度器

在ResourceManager中配置它要使用的調度器,配置方式是修改conf/yarn-site.xml,設置屬性:this

yarn.resourcemanager.scheduler.class
=>
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

配置隊列

調度器的核心就是隊列的分配和使用了,修改conf/capacity-scheduler.xml能夠配置隊列。

Capacity調度器默認有一個預約義的隊列——root,全部的隊列都是它的子隊列。隊列的分配支持層次化的配置,使用.來進行分割,好比yarn.scheduler.capacity.<queue-path>.queues.

下面是配置的樣例,好比root下面有三個子隊列:

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

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

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

隊列屬性

  • yarn.scheduler.capacity. .capacity

它是隊列的資源容量佔比(百分比)。系統繁忙時,每一個隊列都應該獲得設置的量的資源;當系統空閒時,該隊列的資源則能夠被其餘的隊列使用。同一層的全部隊列加起來必須是100%。

  • yarn.scheduler.capacity. .maximum-capacity

隊列資源的使用上限。因爲系統空閒時,隊列可使用其餘的空閒資源,所以最多使用的資源量則是該參數控制。默認是-1,即禁用。

  • yarn.scheduler.capacity. .minimum-user-limit-percent

每一個任務佔用的最少資源。好比,你設置成了25%。那麼若是有兩個用戶提交任務,那麼每一個任務資源不超過50%。若是3個用戶提交任務,那麼每一個任務資源不超過33%。若是4個用戶提交任務,那麼每一個任務資源不超過25%。若是5個用戶提交任務,那麼第五個用戶須要等待才能提交。默認是100,即不去作限制。

  • yarn.scheduler.capacity. .user-limit-factor

每一個用戶最多使用的隊列資源佔比,若是設置爲50.那麼每一個用戶使用的資源最多就是50%。

運行和提交應用限制

  • yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity. .maximum-applications

設置系統中能夠同時運行和等待的應用數量。默認是10000.

  • yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity. .maximum-am-resource-percent

設置有多少資源能夠用來運行app master,即控制當前激活狀態的應用。默認是10%。

隊列管理

  • yarn.scheduler.capacity. .state

隊列的狀態,可使RUNNING或者STOPPED.若是隊列是STOPPED狀態,那麼新應用不會提交到該隊列或者子隊列。一樣,若是root被設置成STOPPED,那麼整個集羣都不能提交任務了。現有的應用能夠等待完成,所以隊列能夠優雅的退出關閉。

  • yarn.scheduler.capacity.root. .acl_submit_applications

訪問控制列表ACL控制誰能夠向該隊列提交任務。若是一個用戶能夠向該隊列提交,那麼也能夠提交任務到它的子隊列。

  • yarn.scheduler.capacity.root. .acl_administer_queue

設置隊列的管理員的ACL控制,管理員能夠控制隊列的全部應用程序。一樣,它也具備繼承性。

注意:ACL的設置是user1,user2 group1,group2這種格式。若是是*則表明任何人。空格表示任何人都不容許。默認是*.

其餘屬性

  • yarn.scheduler.capacity.resource-calculator

資源計算方法,默認是org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator,它只會計算內存。DominantResourceCalculator則會計算內存和CPU。

  • yarn.scheduler.capacity.node-locality-delay

調度器嘗試進行調度的次數。通常都是跟集羣的節點數量有關。默認40(一個機架上的節點數)

一旦設置完這些隊列屬性,就能夠在web ui上看到了。能夠訪問下面的鏈接:

xxx:8088/scheduler

修改隊列配置

若是想要修改隊列或者調度器的配置,能夠修改

vi $HADOOP_CONF_DIR/capacity-scheduler.xml

修改完成後,須要執行下面的命令:

$HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues

注意:

  • 隊列不能被刪除,只能新增。
  • 更新隊列的配置須要是有效的值
  • 同層級的隊列容量限制想加須要等於100%。

參數

1 Hadoop YARN配置參數剖析(5)—Capacity Scheduler相關參數

2 capacity調度器官方文檔

3 《Hadoop Yarn權威指南》

相關文章
相關標籤/搜索