zoukankan      html  css  js  c++  java
  • YARN的capacity调度器主要配置分析

    yarn中一个基本的调度单元是队列。

    yarn的内置调度器:

    1.FIFO先进先出,一个的简单调度器,适合低负载集群。
    2.Capacity调度器,给不同队列(即用户或用户组)分配一个预期最小容量,在每个队列内部用层次化的FIFO来调度多个应用程序。
    3.Fair公平调度器,针对不同的应用(也可以为用户或用户组),每个应用属于一个队列,主旨是让每个应用分配的资源大体相当。(当然可以设置权重),若是只有一个应用,那集群所有资源都是他的。 适用情况:共享大集群、队列之间有较大差别。

    capacity调度器的启用:

    在ResourceManager节点上的yarn-site.xml设置
    Property===>yarn.resourcemanager.scheduler.class
    Value=====>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

    capacity调度器的配置:

    在目录$HADOOP_HOME/hadoop/etc/hadoop/capacity-scheduler.xml

    修改完成后,需要执行下面的命令:

    $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues    使功能动态生效。

    capacity-scheduler.xml的配置

    1.定义层级队列

     1 <property>
     2   <name>yarn.scheduler.capacity.root.queues</name> 
     3   <value>a,b,c</value>            //root根队列下有三个子队列
     4   <description>The queues at the this level (root is the root queue).
     5   </description>
     6 </property>
     7 
     8 <property>
     9   <name>yarn.scheduler.capacity.root.a.queues</name>
    10   <value>a1,a2</value>            //root.a队列下有2个子队列
    11   <description>The queues at the this level (root is the root queue).
    12   </description>
    13 </property>
    14 
    15 <property>
    16   <name>yarn.scheduler.capacity.root.b.queues</name>
    17   <value>b1,b2,b3</value>        //root.b队列下有3个子队列
    18   <description>The queues at the this level (root is the root queue).
    19   </description>
    20 </property>

    2.队列的调度

    如上定义了

    /----------a-----------a1

           -----------a2

         b----------b1

          ----------b2

          ----------b3

         c

    这种结构的队列。

    队列调度算法工作方式

    • 在每一层级,队列排序是根据当前队列使用资源的占比确定的,(占比相同,根据队列全路径名排序)
    • 根队列将集群容量分配给第一层父队列(a,b,c),并对每个父队列递归调度。(a,b,c三个队列容量之和为100,容量是按百分比分配的)
    • 父队列下的(同层级)子队列调度同上,也按容量限制。
    • 子队列下管理的多个应用程序,按照FIFO方式调度资源。

    每个队列都有最大最小资源占用限制,单个用户不会占尽集群资源,后文Capacity资源分配部分会详细介绍。

    3.队列的访问权限控制

    配置文件 $HADOOP_HOME/hadoop/etc/hadoop/capacity-scheduler.xml

    <property>
      <name>yarn.scheduler.capacity.root.a.acl_submit_applications</name> 
      <value>user1,user2 group</value>            
    </property>
    <property>
      <name>yarn.scheduler.capacity.root.a.acl_administer_queue</name> 
      <value>"group"</value>            
    </property>

    配置了可以提交任务到root.a队列的用户或用户组,其他用户没有权限提交任务到这个队列。value=*表示所有用户都可以提交。

    root.a队列的管理员group,有权限查看该队列所有用户提交的应用程序细节。

    4.队列容量配置

      <property>
        <name>yarn.scheduler.capacity.root.a.capacity</name>
        <value>40</value>
        <description>队列a占40%</description>
      </property>
      <property>
        <name>yarn.scheduler.capacity.root.b.capacity</name>
        <value>50</value>
        <description>队列b占50%</description>
      </property>
      <property>
        <name>yarn.scheduler.capacity.root.c.capacity</name>
        <value>10</value>
        <description>队列c占10%</description>
      </property>

    队列容量是以百分比表示的,按照a:b:c即4:5:1的比例共享集群资源。

    子队列容量配置

      <property>
        <name>yarn.scheduler.capacity.root.a.a1.capacity</name>
        <value>30</value>
        <description>队列root.a.a1占30%</description>
      </property>
      <property>
        <name>yarn.scheduler.capacity.root.a.a2.capacity</name>
        <value>70</value>
        <description>队列root.a.a2占70%</description>
      </property>

    层级结构中同层级子队列容量之和不超过100%。

    容量弹性配置项

      <property>
        <name>yarn.scheduler.capacity.root.a.a1.maximum-capacity</name>
        <value>40</value>
      </property>

    该设置项表示可以超出父队列容量的40%,即总容量=分配的容量*140%。(实在其他队列空闲的情况下,若是其他队列有充足的任务进行,是按照比例分配的)

    5.用户级别限制

    用户最小资源占用设置

     <property>
        <name>yarn.scheduler.capacity.root.a.a1.minimun-user-limit-percent</name>
        <value>20</value>
      </property>

    如上配置表示一个用户最少能占用队列root.a.a1容量的20%。

    随着提交任务用户数的增长,有如下情况:

    1.刚开始队列空闲,只有user1提交任务后,user1独占队列。

    2.user2开始提交任务,user1多占用的资源不会立即释放,等user1的Container完成任务后才分配给user2。(如果Capacity调度器的抢占功能打开,user1占用的Container会被立即杀死并分配给user2)

    3.第6个用户user6提交任务后(前5个用户都有任务在执行),不会分配资源给user6,应为要保证最少资源占用20%的保障,user6会放在等待列表,等待一个或多个用户任务结束。

    4.每个用户提交的任务,基于FIFO顺序调度,先提交的任务优先级高于后提交的任务。

    用户容量弹性配置项

     <property>
        <name>yarn.scheduler.capacity.root.a.a1.user-limit-factor</name>
        <value>2</value>
      </property>

    该配置默认值为1,表示单个用户最大可以占该队列容量的100%,为2表示单个用户最大可以占该队列容量的200%。

    6.队列的状态

    YARN中队列有2种状态:运行和停止。

    <property>
        <name>yarn.scheduler.capacity.root.a.a1.state</name>
        <value>RUNNING</value>
        <description>
          State can be one of RUNNING or STOPPED.
        </description>
      </property>

    7.应用程序限制

      <property>
        <name>yarn.scheduler.capacity.maximum-applications</name>
        <value>10000</value>
        <description>
       特定队列最大允许应用程序总数
        </description>
      </property>
    
      <property>
        <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
        <value>0.1</value>
        <description>
          AppMaster占用队列资源的最大比例
        </description>
      </property>

    若要限制指定队列,修改为yarn.scheduler.capacity.root.a.maximum-am-resource-percent和yarn.scheduler.capacity.root.a.maximum-applications

    参考:

    《hadoop yarn权威指南》第8章 YARN中的Capacity调度器

  • 相关阅读:
    (九)栈上分配与逃逸分析
    (八)内存分配策略
    (七)垃圾收集器
    (六)垃圾回收算法
    (五)垃圾回收之判定垃圾对象
    (四)java对象的结构和对象的访问定位
    (三)java虚拟机内存管理和线程独占区和线程共享区
    Spark SQL1.2与HDP2.2结合
    待整理
    Ambari部署HDP:HBase Master启动后自动消失
  • 原文地址:https://www.cnblogs.com/yanghaolie/p/6274098.html
Copyright © 2011-2022 走看看