Yarn隊列

yarn隊列提交spark任務權限控制

轉載請註明出處:http://www.cnblogs.com/xiaodf/

 

1 CapacityScheduler

 

1.1 模型介紹

Capacity Scheduler是一個hadoop支持的可插拔的資源調度器,它允許多租戶安全的共享集羣資源,它們的applications在容量限制之下,可以及時的分配資源。使用操作友好的方式運行hadoop應用,同時最大化吞吐能力和集羣利用率。
Capacity Scheduler提供的核心理念就是Queues(隊列),這些queues通常有管理員設定。爲了在共享資源上,提供更多的控制和預見性,Capacity Scheduler支持多級queue,以確保在其他queues允許使用空閒資源之前,資源可以在一個組織的sub-queues之間共享。

 

1.2 資源分配相關參數

1) capacity:Queue的容量百分比,float類型,例如12.5。所有Queue的各個層級的capacity總和必須爲100。因爲彈性資源分配,如果集羣中有較多的空閒資源,queue中的application可能消耗比此設定更多的Capacity。

2) maximum-capacity: queue capacity最大佔比,float類型,此值用來限制queue中的application的彈性的最大值。默認爲-1禁用“彈性限制”。

3) minimum-user-limit-percent:任何時間如果有資源需要,每個queue都會對分配給一個user的資源有一個強制的限制,這個user-limit可以在最大值和最小值之間。此屬性就是最小值,其最大值依賴於提交applications的用戶的個數。例如:假設此值爲25,如果有2個用戶向此queue提交application,那麼每個用戶最多消耗queue資源容量的50%;如果第三個user提交了application,那麼任何一個user使用資源容量不能超過queue的33%;4個或者更多的用戶參與,那麼每個用戶資源使用都不會超過queue的25%。默認值爲100,表示對沒有用戶資源限制。

4) user-limit-factor:queue容量的倍數,用來設置一個user可以獲取更多的資源。默認值爲1,表示一個user獲取的資源容量不能超過queue配置的capacity,無論集羣有多少空閒資源。此值爲float類型。[最多仍不超過maximum-capacity]。

 

1.3 限制應用程序數目相關參數

1) maximum-applications :集羣或者隊列中同時處於等待和運行狀態的應用程序數目上限,這是一個強限制,一旦集羣中應用程序數目超過該上限,後續提交的應用程序將被拒絕,默認值爲10000。所有隊列的數目上限可通過參數yarn.scheduler.capacity.maximum-applications設置(可看做默認值),而單個隊列可通過參數yarn.scheduler.capacity..maximum-applications設置適合自己的值。

2) maximum-am-resource-percent:集羣中用於運行應用程序ApplicationMaster的資源比例上限,該參數通常用於限制處於活動狀態的應用程序數目。該參數類型爲浮點型,默認是0.1,表示10%。所有隊列的ApplicationMaster資源比例上限可通過參數yarn.scheduler.capacity. maximum-am-resource-percent設置(可看做默認值),而單個隊列可通過參數yarn.scheduler.capacity.. maximum-am-resource-percent設置適合自己的值。

 

1.4 隊列訪問和權限控制參數

1) state :隊列狀態可以爲STOPPED或者RUNNING,如果一個隊列處於STOPPED狀態,用戶不可以將應用程序提交到該隊列或者它的子隊列中,類似的,如果ROOT隊列處於STOPPED狀態,用戶不可以向集羣中提交應用程序,但正在運行的應用程序仍可以正常運行結束,以便隊列可以優雅地退出。

2) acl_submit_applications:限定哪些Linux用戶/用戶組可向給定隊列中提交應用程序。需要注意的是,該屬性具有繼承性,即如果一個用戶可以向某個隊列中提交應用程序,則它可以向它的所有子隊列中提交應用程序。配置該屬性時,用戶之間或用戶組之間用“,”分割,用戶和用戶組之間用空格分割,比如“user1, user2 group1,group2”。

3) acl_administer_queue:爲隊列指定一個管理員,該管理員可控制該隊列的所有應用程序,比如殺死任意一個應用程序等。同樣,該屬性具有繼承性,如果一個用戶可以向某個隊列中提交應用程序,則它可以向它的所有子隊列中提交應用程序。

 

2 線上實例

 

2.1 配置

 

2.1.1 配置ResourceManager使用CapacityScheduler

修改yarn-site.xml中的配置項,指定Scheduler

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

 

2.1.2 配置Queues

CapacityScheduler將會使用capacity-scheduler.xml作爲queue配置文件。CapacityScheduler已經預定義了一個queue:root。系統中所有的queue都是root queue的子節點。其他的queues列表可以通過“yarn.scheduler.capacity.root.queues”中指定,每個queue名稱以“,”分割。CapacityScheduler使用了一個稱爲“queue path”的概念來表示“多級queue”,“queue path”是一個queue層級的全路徑,且以“root”開頭,路徑中以“.”作爲分割符。
一個指定queue的子節點可以通過“yarn.scheduler.capacity..queues”風格來定義。子節點不從父節點上直接繼承properties,除非另有說明。例如,root queue有a,b,c三個子節點,以及a和b也有自己的sub-queue。

在CM頁面,進入yarn配置,選擇“容量調度程序配置高級配置代碼段(安全閥)”,寫入如下內容,保存。
如果在運行時,添加了queue或者修改了ACLs,可按頁面提示刷新。但是刪除Queue是不支持的,需要依次重啓備用和活動的ResourceManager角色使配置生效。

<?xml version="1.0" encoding="UTF-8"?>
<configuration> 
  <property> 
    <name>yarn.scheduler.capacity.root.queues</name>  
    <value>default,wa,yq</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.capacity</name>  
    <value>100</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.acl_administer_queue</name>  
    <value>admin</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.acl_submit_applications</name>  
    <value>admin</value> 
  </property>
  <property> 
    <name>yarn.scheduler.capacity.root.default.capacity</name> 
    <value>30</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>  
    <value>35</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.wa.capacity</name>  
    <value>45</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.wa.maximum-capacity</name>  
    <value>50</value> 
  </property>  
<property> 
    <name>yarn.scheduler.capacity.root.yq.capacity</name>  
    <value>25</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.yq.maximum-capacity</name>  
    <value>30</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.wa.acl_administer_queue</name>  
    <value>admin,user01</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.wa.acl_submit_applications</name>  
    <value>admin,user01</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.yq.acl_administer_queue</name>  
    <value>admin,user02</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.yq.acl_submit_applications</name>  
    <value>admin,user02</value> 
  </property>  
   <property> 
    <name>yarn.scheduler.capacity.resource-calculator</name>  
    <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value> 
  </property>  
</configuration>

以上配置生效後可以進入Yarn Web UI頁面查看,隊列設置是否正確,如下所示:

注意:
1、 所有隊列的capacity容量和爲100%
2、 配置文件標紅參數:
yarn.scheduler.capacity.root.acl_administer_queue
yarn.scheduler.capacity.root.acl_submit_applications表示admin用戶爲根隊列的超級用戶,即可操作根隊列下的所有子隊列,這個兩個參數必須設置,否則,對子隊列設置的用戶訪問控制不會生效。

 

2.2 測試

【2.1 配置】裏我們分別配置了隊列wa和yq的可訪問用戶,即用戶user01可訪問隊列wa,用戶user02可訪問隊列yq,用戶admin對可訪問所有隊列,下面我們對以上設置進行測試。
我們通過在yarn隊列中能否提交spark-shell來驗證用戶對隊列是否有訪問權限。

 

2.2.1 用戶user01能訪問隊列wa,不能訪問隊列yq

[root@node1a142 ~]# kinit user01
Password for [email protected]: 

用戶user01對隊列wa有訪問權限,spark-shell正常提交

[root@node1a142 ~]# spark-shell --master yarn --queue wa
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc (master = yarn-client, app id = application_1483697304069_0012).
SQL context available as sqlContext.

scala> 

用戶user01對隊列yq沒有訪問權限,spark-shell提交報錯

 [root@node1a142 ~]# spark-shell --master yarn --queue yq
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67)
Type in expressions to have them evaluated.
Type :help for more information.
17/01/09 14:29:09 ERROR spark.SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master.

不指定隊列時,使用的是默認隊列default,用戶user01沒有權限,spark-shell提交報錯

[root@node1a142 ~]# spark-shell --master yarn 
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67)
Type in expressions to have them evaluated.
Type :help for more information.
17/01/09 16:50:15 ERROR spark.SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master.

 

2.2.2 用戶user02能訪問隊列yq,不能訪問隊列wa

跟user01測試結果相似,此處略。

 

2.2.3 用戶admin能訪問所有隊列

[root@node1a142 ~]# kinit admin
Password for [email protected]: 

用戶admin對隊列wa有訪問權限,spark-shell正常提交

[root@node1a142 ~]# spark-shell --master yarn --queue wa
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc (master = yarn-client, app id = application_1483949565487_0001).
SQL context available as sqlContext.
scala> 

用戶admin對隊列yq有訪問權限,spark-shell正常提交

 [root@node1a142 ~]# spark-shell --master yarn --queue yq
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc (master = yarn-client, app id = application_1483949565487_0002).
SQL context available as sqlContext.

scala>

用戶admin對默認隊列default也有訪問權限,spark-shell正常提交

 [root@node1a142 ~]# spark-shell --master yarn 
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc (master = yarn-client, app id = application_1483949565487_0003).
SQL context available as sqlContext.

scala>

轉載自:https://www.cnblogs.com/xiaodf/p/6266201.html

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