Hadoop-2.2.0中文文档—— MapReduce 下一代--容量调度器


目的

这份文档描述 CapacityScheduler,一个为Hadoop能允许多用户安全地共享一个大集群的插件式调度器,如他们的应用能适时被分配限制的容量。

概述

CapacityScheduler 被设计成以分享的、多用户集群运行 Hadoop 应用并最大化利用集群的机制。

传统上,每一个组织都会有它自己的私有电脑资源,在顶峰或接近顶峰状态有充足的容量来面对组织的SLA。这通常导致低平均利用和管理多个独立集群的管理费用,每个集群要有一个。组织间共享安装在Hadoop的集群是一种低成本的方式,允许他们得到规模经济利益,而不用创建私有集群。然而,组织关心共享一个集群是因为他们担心别人使用对他们的SLA重要的资源。


CapacityScheduler被设计成允许每个组织的容量保证,来共享一个大的集群。其中心思想是 Hadoop集群中的可用资源是基于他们的计算需要多个组织间共享的。有一个额外好处是一个组织能得到任何别的用户没有在使用的容量。这在一个有效支出模式中为组织提供了弹性。

跨组织间共享集群的必要性是支持多用户,由于每个组织必须被保证容量和安全以确保共享的应用。CapacityScheduler 提供了一个严格的限制以确保单应用或用户或队列不能以不合适的方式消费集群中的资源。还有, CapacityScheduler 提供了在用户在初始化/请求应用时的限制,以保证集群的稳定性。


 CapacityScheduler提供的主要抽象概念是  queues. 这些队列一般由管理员设置以经济地共享集群。

要对集群资源提供更多的控制和预测, CapacityScheduler 支持层级化队列以保证组织中共享的资源在别的队列之前能使用,对给定的组织间共享资源提供了友好性。

特性

 CapacityScheduler 支持如下的特性:

  • 层级化 队列 —— 支持队列层级化以保证在其他用户使用空闲资源之前,子队列中的资源由一个组织共享,从而提供更多的控制性和可预测性。
  • Capacity 保证 —— 就一个确定的资源容量安排而言,队列被分配成网格中的容量的一部分 。所有提交给一个队列的应用将对分配给队列的容量有使用权。管理者可以在每个队列的分配容量上配置软限制和可选的硬限制。
  • 安全 —— 每个队列有严格的ACLs,控制着那个用户可以像一个单独的队列提交应用。还有,有安全保障保证用户不能看 并且/或 修改来自别的用户的应用。另外,支持每个队列和系统管理者角色。
  • 弹性 —— 闲置资源可以分配给任何超过其容量的队列。当以低容量正在运行的队列需要这些资源,随着在这些资源上的任务调度的完成,他们将会被分配给以低容量运行的队列(不支持抢占)。这保证了队列可以有预测性的、弹性的获取资源,因而对避免在集群中为提高利用率,而对资源人工清仓。 
  • 多用户 —— 提供了全面的限制以防止一个独立应用、用户和队列垄断队列中的资源或作为一个整体的集群,以保证集群不被压垮。
  • 可移植性
    • 运行时配置 —— 队列定义和属性,如容量、ACLs可以在运行时被管理员以安全的方式修改,以最小化对用户的破坏。还有,提供给用户和管理员一个控制台来查看系统中当前不同队列的分配的资源。管理员可以在运行时添加额外的队列,但是队列不能在运行时删除
    • Drain 应用 —— 管理员可以在运行时停止队列,以保证当现存的应用执行完成前,没有新应用可以提交。如果一个队列是在STOPPED 状态, 新的应用不能提交给它或任何其子队列。已存在应用将继续到完成,因此队列可以优雅地关闭。此时管理员可以启动关闭了的应用。
  • 基于资源调度 - 对资源集中的应用有支持,一个应用可以可选的指定比默认更高的资源需要,因而适应应用有不同的资源需要。当前,支持内存作为资源需要。

配置

  • 设置 ResourceManager 以用 CapacityScheduler ,在conf/yarn-site.xml中设置下列属性
    属性
    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 的配置使用一种叫做 queue path 的概念来配置队列的层级。 queue path 是队列层级的全路径,从 root 开始, 以 . (点)作为分隔符。

    一个给定的队列的子队列可以用 knod配置: yarn.scheduler.capacity.<queue-path>.queues来定义。除非声明,子队列不直接继承父队列的属性。

    下面是一个有三个顶级队列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>
  • 队列属性
    • 资源分配
      属性 描述
      yarn.scheduler.capacity.<queue-path>.capacity 队列 容量 百分比 (%) 写为浮点数 (e.g. 12.5). 在每一层上,所有队列容量的总和,必须等于100。假设有闲置资源和弹性,队列中的应用可能消耗比队列容量更多的资源。
      yarn.scheduler.capacity.<queue-path>.maximum-capacity 写为浮点数的最大队列百分比 (%) .这个限制队列中应用的弹性。 默认为 -1 ,即禁用之。
      yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent 在任何给定时间,如果有资源使用需要,每个队列对一个用户执行一个资源分配百分比限制。用户限制会在一个最小值和最大值之间变动。前者(最小值) 设置给这个值,后者(最大值)依据已经提交了应用的用户的数量,例如,假设这个值是25。如果两个用户已经提交应用给一个队列,没有用户可以使用超过 50% 的队列资源。如果第三个用户提交了一个应用,没有一个用户可以使用超过 33% 的队列资源。有4或更多的用户,没有用户可以使用超过 25% 的队列资源。值为100 则说明没有用户限制。默认值是100.
      yarn.scheduler.capacity.<queue-path>.user-limit-factor 队列容量中的多数可以配置为允许单用户获取更多的资源。默认的,这个设为 1 ,以保证单个用户永远不会占用超过队列配置容量,而不管无论集群怎样闲置。此值声明为一个浮点数。
    • 运行和请求应用限制

      CapacityScheduler 支持下面的参数以控制正在和等待运行的应用:

      属性 描述
      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%. 这个可以通过 yarn.scheduler.capacity.maximum-am-resource-percent 为所有队列设置,也可以被在每一个队列上的设置 yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent覆盖.
    • 队列管理和权限

      CapacityScheduler 支持如下的参数配置以管理资源:

      属性 描述
      yarn.scheduler.capacity.<queue-path>.state 队列的状态。可以是RUNNING 和 STOPPED 中的一个。如果一个队列在 STOPPED 状态,新的应用不能提交给它或任何其子队列。因此,如果root 队列是 STOPPED 状态,则无应用可以提交给整个集群。已存在应用将继续到完成,因此队列可以优雅地关闭。
      yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications  ACL 控制谁可以提交应用给一个给定的队列。如果给定的 用户/组 在给定的队列或层级中他们可以提交应用的父队列中的一个上有必要的 ACLs。如果没有特别声明,这个属性的 ACLs 继承于父队列。
      yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue ACL 控制谁可以 管理 给定队列上的应用。如果给定的 用户/组 在给定的队列或层级中他们可以管理应用的父队列中的一个上有必要的 ACLs。如果没有特别声明,这个属性的 ACLs 继承于父队列。

      注意: 一个 ACL 的格式是这样 user1user2空格group1group2代表任何人. 空格代表没有人。如果没有声明,对root队列,默认是 * 。

    • 回顾 CapacityScheduler 的配置

      一旦完成了安装配置, 在启动YARN集群后你可以在浏览器中检查。

      • 以正常方式启动 YARN 集群。
      • 启动 ResourceManager web UI.
      •  /scheduler 页面应该显示每个队列的使用情况。

改变队列配置

改变队列属性和添加新队列很简单。你需要编辑 conf/capacity-scheduler.xml 并运行 yarn rmadmin -refreshQueues.

$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues

说明: 队列不能被删除,只支持添加新队列——更新的配置应该合法,例如,每一层的队列容量应该是100%。

相关内容