YARN-Capacity Scheduler
原文:https://hadoop.apache.org/docs/r2.6.4/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
概覽
CapacityScheduler被設計用來以一種操作友好的並且最大化吞吐和集群利用率的方式調度一個共享的、多租戶集群從而可以支持運行Hadoop應用程序。
傳統情況下,每個組織都有自己的私有計算資源組,其可以保證有效容量能滿足組織業務的SLA,即便在峰值或接近峰值的情況下也足夠。但這通常會導致很差的平均資源利用率以及很大的集群管理開銷,一般每個組織需要一個集群。組織間共享集群是一種降低成本的有效手段,尤其是運行大型的Hadoop程序,因為這使他們獲得不需要創建私有集群而帶來成本降低。然而組織間也會關注如何共享一個集群,因為它們會擔心其它人占用資源而影響了自己的SLA。
CapacityScheduler被設計來允許多組織共享一個集群同時給每個組織足夠的容量保障。其核心思想是Hadoop集群的可用資源被多個組織共享,其分配的資源量由其在集群中的計算需求而決定。一個額外的好處是一個組織可以使用沒有被他人占用的超過自己容量限製的額外資源。這為組織的成本考量提供了彈性。
跨組織的集群共享,必須要確保能支持多租戶。因為每個組織必須要保證有容量和安全保障來確保共享集群不被單一的程序、用戶或其他東西影響。CapacityScheduler提供了一組嚴格的限製來確保單一程序或用戶或隊列不會不適當地消費集群中的資源。同樣的,CapacityScheduler提供了限製來初始化和掛起單一用戶和隊列的應用程序,從而可以確保集群的公平和穩定。
CapacityScheduler能提供的主要抽象是對於隊列的概念。這些隊列一般由管理員配置,用這些隊列來刻畫和反映共享集群中的經濟狀況(成本和資源情況)
為了給共享資源提供更多的控製和可預測性,CapacityScheduler支持層級隊列來確保資源可以在一個組織的子隊列(sub-queues)裏共享,而不被其它組織提前分配掉。也就是提供了一種關聯,來保證一個組織擁有在其多個程序之間的空閑資源共享的能力。
特性
CapacityScheduler支持如下特性:
- Hierarchical Queues 層級隊列: 隊列層級層級隊列來確保資源可以在一個組織的子隊列(sub-queues)裏共享,而不被其它組織提前分配掉。也就是提供了一種關聯,來保證一個組織擁有在其多個程序之間的空閑資源共享的能力。這為集群提供了更多的可控性和可預測性。
- Capacity Guarantees容量保證:隊列被分配了一係列的容量格子,這些格可以保證這些容量是可以由應用支配的。所有提交到隊列的應用程序都可以訪問分配給這個隊列的資源。管理員可以配置軟限製和可選的硬限製來分配每個隊列的容量。
- Security安全:每個隊列有嚴格的ACL來控製用戶訪問和作業提交。同理也有對應的安全防護來保證用戶不能查看和修改其他用戶的應用程序。每個隊列和係統的管理員角色都是支持的。
- Elasticity彈性:空閑資源可以被分配給任意的隊列而無視其容量。當又需求來申請這些資源時,這些資源會被分配給對應的隊列,前提是這些隊列在某個接下來的時刻資源容量低於其隊列限製。這就確保了資源以一種可預測和彈性的方式分配給隊列,避免了集群中資源的隨意使用從而幫助提升利用率。
- Multi-tenancy多租戶:提供了廣泛的限製來避免一個單一程序或用戶或者隊列獨占集群資源,從而確保集群不會被壓垮。
- Operability可操作性:
- Runtime Configuration運行時配置:隊列的定義和屬性比如容量、ACL等可以在運行時被改變, 管理員可以操作,當然以一種安全的方式來最小化損害用戶。同時,也提供了一個控製台給用戶和管理員來查看當前係統各個隊列的資源分配情況。管理員可以在運行時添加額外的隊列,但是不允許刪除隊列。
- Drain applications流幹應用:管理員可以在運行時停止隊列來確保當已存在的應用運行到完成前,沒有新的應用可以被提交。如果一個隊列處於STOPPED狀態,新的應用不允許被提交到這個隊列以及任何它的子隊列。已有的應用繼續執行到完成,這樣這個隊列就可以優雅地結束掉了(排幹)。然後管理員就可以再開啟之前停掉的隊列。(像個排水管一樣停止閥門後排幹剩餘的水)
- Resource-based Scheduling基於資源調度:支持資源密集應用,當一個應用需要超過默認配置的比較高的資源需求時,利用不同的資源需求配置來調整應用與之適應。當前支持對於內存的資源需求配置調度。
配置
- 設置ResourceManager來使用CapacityScheduler。 在conf/yarn-site.xml中設置如下的屬性來配置ResourceManager使用CapacityScheduler:
Property | Value |
---|---|
yarn.resourcemanager.scheduler.class | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler |
-
設置隊列
conf/capacity-scheduler.xml是CapacityScheduler的配置文件。CapacityScheduler有一個預定義的隊列叫做root。係統中所有的隊列都是root隊列的子隊列。
更多的隊列可以被設置,通過配置yarn.scheduler.capacity.root.queues來完成,具體配置項是一係列由逗號分隔的隊列列表。
CapacityScheduler使用了一個叫做隊列路徑的概念來配置層級隊列。隊列路徑是隊列的層級的全路徑,起始是root,用.號作為間隔符。
一個給定隊列的子隊列,通過一個配置來完成:yarn.scheduler.capacity.< queue-path>.queues。除非單獨標記出來,否則子隊列不繼承父隊列的屬性。
下麵是一個例子,表示了一個3個頂層的子隊列a,b和c以及一些a和b的子隊列:
<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>
- 隊列屬性
- 資源分配
Property | Description |
---|---|
yarn.scheduler.capacity.< queue-path>.capacity | 隊列的容量,以浮點數表示的百分比%(比如12.5)。在每個層級的隊列的容量之和必須等於100。隊列中的應用是有可能消費更多的資源的,前提是有空閑資源彈性提供。 |
yarn.scheduler.capacity.< queue-path>.maximum-capacity | 隊列的最大容量,以浮點數表示的百分比%。該限製對於隊列中的應用來說是彈性的。默認是-1代表無限製。 |
yarn.scheduler.capacity.< queue-path>.minimum-user-limit-percent | 每個隊列強製安排一個在任意時間分配給一個用戶的資源占比限製,如果有資源需求的話。用戶限製可以在最小值和最大值之間變化。最小值由該屬性決定,而最大值依賴於已經提交了應用的用戶數。比如,如果該值為25,有兩個用戶提交了應用作業到該隊列,那麼沒有一個用戶可以使用超過50%的資源。如果第三個用戶提交了應用,那麼沒有一個用戶可以占有超過33%的隊列資源。當第四個或者更多用戶來提交時,那麼沒有人能占有超過25%的資源。如果設置為100,那麼表示沒有用戶限製。默認值就是100。此值為一個整數。 |
yarn.scheduler.capacity.< queue-path>.user-limit-factor | 多個隊列的容量可以被允許分配給一個用戶。默認值是1,表示單一用戶占有的資源不可能超過這個隊列配置的容量限製,無論這個集群此時有多麼空閑。此值是個浮點數。 |
- 運行和掛起應用的限製 CapacityScheduler支持如下參數來控製運行和掛起應用作業:
Property | Description |
---|---|
yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity.< queue-path>.maximum-applications | 當前係統支持活動的運行和掛起的最大應用作業數。每個隊列的限製直接成比例的依賴於其配置的隊列容量和用戶限製。這是一個硬性限製,當該限製觸發後,任意提交的作業應用都將被拒絕。默認值是10000。這個值也可以被設置對所有隊列生效,通過設置yarn.scheduler.capacity.maximum-applications,也可以設置每個隊列自己的限製yarn.scheduler.capacity.< queue-path>.maximum-applications。該值是個整數 |
yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity.< queue-path>.maximum-am-resource-percent | 集群中允許運行應用master的最大資源占比百分比,此值用來控製並行活動的應用數。每個隊列的限製直接成比例的依賴於其配置的隊列容量和用戶限製。一個浮點數,比如0.5=50%。默認是10%。Specified as a float - ie 0.5 = 50%. Default is 10%. 這個值也可以被設置對所有隊列生效,通過設置 yarn.scheduler.capacity.maximum-am-resource-percent也可以設置每個隊列自己的限製 yarn.scheduler.capacity.< queue-path>.maximum-am-resource-percent |
- 隊列管理和權限 CapacityScheduler支持如下的參數來管理隊列:
Property | Description |
---|---|
yarn.scheduler.capacity.< queue-path>.state | 隊列的狀態。可以是RUNNING或者STOPPED。如果一個隊列是STOPPED狀態,新的應用作業不能被提交到其自身和自己的任何一個子隊列裏。因此,如果root隊列是STOPPED的,那麼整個集群將不允許提交作業。已經存在的作業繼續運行到完成,這樣隊列就被優雅的排幹了。該參數值是枚舉類型。 |
yarn.scheduler.capacity.root.< queue-path>.acl_submit_applications | 控製哪些用戶可以提交作業到該隊列的ACL。如果指定的用戶或組擁有指定隊列的ACL或者層級隊列中任意一個父隊列的ACL,那麼他們可以提交應用作業。如果不聲明該參數,則隊列的ACL從父隊列繼承。 |
yarn.scheduler.capacity.root.< queue-path>.acl_administer_queue | 控製指定隊列的管理應用作業權限的ACL。如果指定的用戶或組擁有指定隊列或層級隊列中任意一個父隊列的ACL,那麼他們可以管理應用作業。如果不聲明該參數,則隊列的ACL從父隊列繼承。 |
注意:ACL的形式如*user1, user2spacegroup1, group2*。特殊符號*代表任意人。如果不聲明,默認的root隊列的ACL是任意人。
- 其他屬性
- 資源計算器Resource Calculator
|Property| Description|
|---|---|
|yarn.scheduler.capacity.resource-calculator| ResourceCalculator用來在調度器中比較資源。默認實現是org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator,該實現隻使用內存。而DominantResourceCalculator使用Dominant-resource來多維度的比較資源,比如一內存、CPU等。此參數值需要時一個Java的ResourceCalculator類名|
- 數據位置Data Locality
|Property| Description|
|---|---|
|yarn.scheduler.capacity.node-locality-delay| CapacityScheduler嚐試去調度rack-local容器之後允許miss的調度機會次數。一般情況,該值設置為集群中的node數。一個機架默認的設置是40。該參數要求是正整數。|
-
回顧CapacityScheduler的配置
當安裝和配置完成後,你可以在啟動YARN集群後通過web-ui來review。- 以normal形式啟動YARN。
- 打開ResourceManager的web界麵。
- /scheduler頁麵可以展示每個獨立隊列的資源使用情況。
改變隊列配置
改變隊列屬性以及添加新隊列都是很簡單的。你隻需要編輯conf/capacity-scheduler.xml
然後運行yarn rmadmin -refreshQueues
。
$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
注意:隊列不能被刪除,隻有添加新隊列操作是支持的,而update更新隊列配置需要時一個合法的配置,比如queue-capacity在每個層級隊列中需要求和是100%的。
最後更新:2017-08-31 13:32:17
上一篇:
MNS client性能提升1000+倍的方法
下一篇:
數字貨幣火爆交易所開發找380T
Linux係統小技巧(2):利用ps工具統計CPU消耗高的進程和統計消耗CPU的百分比
開發那點事係列五 - 技術方案的發散思維
簡單LRU算法實現緩存-update2
權威詳解 | 阿裏新一代實時計算引擎 Blink,每秒支持數十億次計算
“超過響應緩衝區限製”“此 ASP 頁的執行造成響應緩衝區超過其配置限製”問題的解決方法總結
環球花木網的目標就是致力於打造成為“園林相關行業的專業性門戶網站
為什麼幾乎所有電腦公司都害怕亞馬遜
HTAP數據庫 PostgreSQL 場景與性能測試之 23 - (OLAP) 並行計算
iframe中的各種跳轉方法
quartz - misfire錯過觸發時機的處理