天天看點

大資料之Yarn——Capacity排程器概念以及配置

試想一下,你現在所在的公司有一個hadoop的叢集。但是A項目組經常做一些定時的BI報表,B項目組則經常使用一些軟體做一些臨時需求。那麼他們肯定會遇到同時送出任務的場景,這個時候到底如何配置設定資源滿足這兩個任務呢?是先執行A的任務,再執行B的任務,還是同時跑兩個?

如果你存在上述的困惑,可以多了解一些yarn的資源排程器。

在Yarn架構中,排程器是一塊很重要的内容。有了合适的排程規則,就可以保證多個應用可以在同一時間有條不紊的工作。最原始的排程規則就是FIFO,即按照使用者送出任務的時間來決定哪個任務先執行,但是這樣很可能一個大任務獨占資源,其他的資源需要不斷的等待。也可能一堆小任務占用資源,大任務一直無法得到适當的資源,造成饑餓。是以FIFO雖然很簡單,但是并不能滿足我們的需求。

大資料之Yarn——Capacity排程器概念以及配置

yarn預設還提供了兩種排程規則,capacity和fair share。本篇就主要介紹下capacity排程器:

大資料之Yarn——Capacity排程器概念以及配置

Capacity排程器說的通俗點,可以了解成一個個的資源隊列。這個資源隊列是使用者自己去配置設定的。比如我大體上把整個叢集分成了AB兩個隊列,A隊列給A項目組的人來使用。B隊列給B項目組來使用。但是A項目組下面又有兩個方向,那麼還可以繼續分,比如專門做BI的和做實時分析的。那麼隊列的配置設定就可以參考下面的樹形結構:

a隊列占用整個資源的60%,b隊列占用整個資源的40%。a隊列裡面又分了兩個子隊列,一樣也是2:3配置設定。

雖然有了這樣的資源配置設定,但是并不是說a送出了任務,它就隻能使用60%的資源,那40%就空閑着。隻要資源實在空閑狀态,那麼a就可以使用100%的資源。但是一旦b送出了任務,a就需要在釋放資源後,把資源還給b隊列,直到ab平衡在3:2的比例。

粗粒度上資源是按照上面的方式進行,在每個隊列的内部,還是按照FIFO的原則來配置設定資源的。

capacity排程器具有以下的幾個特性:

階層化的隊列設計,這種階層化的隊列設計保證了子隊列可以使用父隊列設定的全部資源。這樣通過階層化的管理,更容易合理配置設定和限制資源的使用。

容量保證,隊列上都會設定一個資源的占比,這樣可以保證每個隊列都不會占用整個叢集的資源。

安全,每個隊列又嚴格的通路控制。使用者隻能向自己的隊列裡面送出任務,而且不能修改或者通路其他隊列的任務。

彈性配置設定,空閑的資源可以被配置設定給任何隊列。當多個隊列出現争用的時候,則會按照比例進行平衡。

多租戶租用,通過隊列的容量限制,多個使用者就可以共享同一個叢集,同僚保證每個隊列配置設定到自己的容量,提高使用率。

操作性,yarn支援動态修改調整容量、權限等的配置設定,可以在運作時直接修改。還提供給管理者界面,來顯示目前的隊列狀況。管理者可以在運作時,添加一個隊列;但是不能删除一個隊列。管理者還可以在運作時暫停某個隊列,這樣可以保證目前的隊列在執行過程中,叢集不會接收其他的任務。如果一個隊列被設定成了stopped,那麼就不能向他或者子隊列上送出任務了。

基于資源的排程,協調不同資源需求的應用程式,比如記憶體、CPU、磁盤等等。

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

排程器的核心就是隊列的配置設定和使用了,修改conf/capacity-scheduler.xml可以配置隊列。

Capacity排程器預設有一個預定義的隊列——root,所有的隊列都是它的子隊列。隊列的配置設定支援階層化的配置,使用<code>.</code>來進行分割,比如<code>yarn.scheduler.capacity.&lt;queue-path&gt;.queues</code>.

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

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的設定是<code>user1,user2 group1,group2</code>這種格式。如果是<code>*</code>則代表任何人。<code>空格</code>表示任何人都不允許。預設是<code>*</code>.

yarn.scheduler.capacity.resource-calculator

資源計算方法,預設是<code>org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator</code>,它隻會計算記憶體。<code>DominantResourceCalculator</code>則會計算記憶體和CPU。

yarn.scheduler.capacity.node-locality-delay

排程器嘗試進行排程的次數。一般都是跟叢集的節點數量有關。預設40(一個機架上的節點數)

一旦設定完這些隊列屬性,就可以在web ui上看到了。可以通路下面的連接配接:

如果想要修改隊列或者排程器的配置,可以修改

修改完成後,需要執行下面的指令:

注意:

隊列不能被删除,隻能新增。

更新隊列的配置需要是有效的值

同層級的隊列容量限制想加需要等于100%。

繼續閱讀