Yarn三种调度策略对比

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yarn三种调度策略对比相关的知识,希望对你有一定的参考价值。

参考技术A

什么是YARN?

Apache Hadoop YARN 是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的 资源管理和调度 ,它的引入为集群在 利用率 、 资源统一管理 和 数据共享 等方面带来了巨大好处。也就是说 YARN 在 Hadoop 集群中充当 资源管理 和 任务调度 的框架

负责资源管理和调度的组件:全局的资源管理器 ResourceManager(RM)和每个应用程序的 ApplicationMaster(AM)。应用程序可以是单个作业,也可以是 DAG 作业。ResourceManager 和 NodeManager 组成数据计算框架。

ResourceManager 负责集群资源的统一管理和调度;

NodeManager 负责单节点资源管理和使用,处理来自 ResourceManager/ApplicationMaster 的命令;

ApplicationMaster 负责应用程序的管理;

Container 是对任务运行环境的抽象,描述任务运行资源(节点、内存、CPU), 启动命令以及环境

我们都希望自己提交的作业能够很快被调度并且拿到足够的资源保证 job 进行顺畅。对于共享型集群来说,保证每个作业可以被合理的调度并分配相应的资源,同时考虑成本问题,变得更加困难。但是通过不断的探索 Yarn 的调度策略与可配置方案也可以逐渐接近目标。
Yarn 提供了三种可用资源调度器 (直接从 MRv1 基础上修改而来的):
FIFO Scheduler , Capacity Scheduler , Fair Scheduler

FIFO Scheduler :从字面不难看出就是先进先出策略,所有的任务都放在 一个队列 中,只有 执行完一个任务后 , 才会进行下一个 。这种调度方式最简单,但真实场景中并不推荐,因为会有很多问题,比如如果有大任务独占资源,会导致其他任务一直处于 pending 状态等。

Capacity Scheduler :也就是所谓的容量调度,这种方案更适合 多租户安全地共享大型集群 ,以便在分配的 容量限制下 及 时分配资源 。采用队列的概念,任务提交到队列, 队列 可以设置 资源的占比 ,并且支持层级队列、访问控制、用户限制、预定等等配置。不过对于资源占用比需要不断的摸索与权衡

Fair Scheduler :就是公平调度器,能够 公平地共享大型集群中的资源 ,Fair 调度器会为所有运行的 job 动态的调整系统资源。当只有一个 job 在运行时,该应用程序最多可获取所有资源,再提交其他 job 时,资源将会被重新分配分配给目前的 job,这可以让 大量 job 在合理的时间内完成,减少作业 pending 的情况 。可见 Fair Schedule 比较适用于多用户共享的大集群

随着 Hadoop 版本逐渐演化,Fair Scheduler 和 Capacity Scheduler 的功能越来越完善,因此两个调度器的功能也逐渐趋近,由于 Fair Scheduler 支持多种调度策略,因此可以认为 Fair Scheduler 具备了 Capacity Scheduler 的所有功能

实践与探索

通过分析常见的几种调度器,选用 Fair Schedule 调度器更适合共享型大集群,那么怎样的配置方案更适合多团队多用户呢?资源该按照什么比例分配给队列?用户的不同作业类型该如何区分?每个用户都希望自己可以享用更大的资源,又该如何保证成本问题?...... 实际情况下遇到的问题不计其数,不同的集群规模和应用场景也有不同阶段的问题,都是需要经过探索与实践去逐一攻破。

Fair Scheduler 支持的自定义配置项

minResource:最小资源保证

maxResource:最多可以使用的资源

maxRunningApps:最多同时运行作业数量

minSharePreemptionTimeout:最小共享量抢占时间

schedulingMode/schedulingPolicy:队列采用的调度模式

aclSubmitApps:可在队列中提交作业的用户列表

aclAdministerApps:队列的管理员列表

userMaxJobsDefault:用户的 maxRunningJobs 属性默认值

defaultMinSharePreemptionTimeout:队列 minSharePreemptionTimeout 属性默认值

defaultPoolSchedulingMode:队列 schedulerMode 属性默认值

fairSharePreemptionTimeout:公平共享量抢占时间

fairSharePreemptionThreshold:队列的公平份额抢占阈值,默认值是 0.5f

allowPreemptionFrom:确定是否允许调度程序抢占队列中的资源,默认为 true

(另外通过配置 yarn-site.xml 的 yarn.scheduler.fair.preemption 可以控制集群是否开启抢占功能)

抢占:当某个队列中有剩余资源,调度器会将这些资源共享给其他队列,而当该队列中有新的应用程序提交时,调度器会为它回收资源。那些超额使用的行为即为超发。

划分队列组织结构

合理的队列组织方案也十分重要,如下图就是小米的队列组织模型:

一级队列 :root 队列下面分为三大队列

离线分析 MR/Spark 作业队列:默认开启抢占,大量离线作业比较耗费资源,但是作业等级不算高,因此为了提高资源的利用率,可以允许在集群资源空闲的时候尽可能的超发资源,当然也意味着超发的资源会被回收;

在线计算流式作业队列:针对于作业等级较高的服务,为了保证资源需要设置不支持抢占,当然也需要设置最大超发限制,避免出现集群大作业独占集群资源;

资源池 reserved 队列:预留资源来保证新队列增加,或者其他队列的资源增配相当于资源池的概念,当然也可用于作业超发使用。

二级 / 三级 / 四级队列:

资源与成本优化

总结

可能资源调度并没有最优解,需要不断探索实践去寻找适合目前现状的方案;在发展的不同阶段遇到不同的问题,通过解决问题逐渐去优化和完善。

参考自
https://mp.weixin.qq.com/s/8_1qC0LL_Q8Xf9YIWAa1Zg

YARN资源调度策略之Capacity Scheduler

    

背景

yarn默认使用的是最简单的FIFO调度器,即一个default队列,所有用户共享,分配资源也是先到先得,没有优先级之分。有时一两个任务就把资源全占了,其他任务吃不到资源造成饥饿,显然这样的资源分配是不合理的(在当今社会主义之中,我们要共同富裕啊)。yarn还有两种资源调度器,capacity schedule和fair schedule,本文主要研究下capacity schedule。

什么是capacity schedule

Capacity Schedule调度器以队列为单位划分资源。简单通俗点来说,就是一个个队列有独立的资源,队列的结构和资源是可以进行配置的,如下图:
技术分享

default队列占30%资源,analyst和dev分别占40%和30%资源;类似的,analyst和dev各有两个子队列,子队列在父队列的基础上再分配资源。

队列以分层方式组织资源,设计了多层级别的资源限制条件以更好的让多用户共享一个Hadoop集群,比如队列资源限制、用户资源限制、用户应用程序数目限制。队列里的应用以FIFO方式调度,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可以设定一定的资源使用上限以防止资源滥用。而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。

特性

Capacity调度器具有以下的几个特性:
● 层次化的队列设计,这种层次化的队列设计保证了子队列可以使用父队列设置的全部资源。这样通过层次化的管理,更容易合理分配和限制资源的使用。
● 容量保证,队列上都会设置一个资源的占比,这样可以保证每个队列都不会占用整个集群的资源。
● 安全,每个队列又严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务。
● 弹性分配,空闲的资源可以被分配给任何队列。当多个队列出现争用的时候,则会按照比例进行平衡。
● 多租户租用,通过队列的容量限制,多个用户就可以共享同一个集群,同时保证每个队列分配到自己的容量,提高利用率。
● 操作性,yarn支持动态修改调整容量、权限等的分配,可以在运行时直接修改。还提供给管理员界面,来显示当前的队列状况。管理员可以在运行时,添加一个队列;但是不能删除一个队列。管理员还可以在运行时暂停某个队列,这样可以保证当前的队列在执行过程中,集群不会接收其他的任务。如果一个队列被设置成了stopped,那么就不能向他或者子队列上提交任务了。
● 基于资源的调度,协调不同资源需求的应用程序,比如内存、CPU、磁盘等等。

配置

开启调度器

在ResourceManager中配置它要使用的调度器,配置方式是修改conf/yarn-site.xml,设置属性:

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

配置队列

调度器的核心就是队列的分配和使用了,修改conf/capacity-scheduler.xml可以配置队列。
Capacity调度器默认有一个预定义的队列——root,所有的队列都是它的子队列。队列的分配支持层次化的配置,使用.来进行分割,比如yarn.scheduler.capacity.<queue-path>.queues

下面是配置的样例,比如root下面有三个子队列:

<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

它是队列的资源容量占比(百分比)。系统繁忙时,每个队列都应该得到设置的量的资源;当系统空闲时,该队列的资源则可以被其他的队列使用。同一层的所有队列加起来必须是100%。

yarn.scheduler.capacity.<queue-path>.maximum-capacity

队列资源的使用上限。由于系统空闲时,队列可以使用其他的空闲资源,因此最多使用的资源量则是该参数控制。默认是-1,即禁用。

yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent

每个任务占用的最少资源。比如,你设置成了25%。那么如果有两个用户提交任务,那么每个任务资源不超过50%。如果3个用户提交任务,那么每个任务资源不超过33%。如果4个用户提交任务,那么每个任务资源不超过25%。如果5个用户提交任务,那么第五个用户需要等待才能提交。默认是100,即不去做限制。

yarn.scheduler.capacity.<queue-path>.user-limit-factor

每个用户最多使用的队列资源占比,如果设置为50.那么每个用户使用的资源最多就是50%。

运行和提交应用限制

yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity.<queue-path>.maximum-applications

设置系统中可以同时运行和等待的应用数量。默认是10000.

yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent

设置有多少资源可以用来运行app master,即控制当前激活状态的应用。默认是10%。

队列管理

yarn.scheduler.capacity.<queue-path>.state

队列的状态,可以使RUNNING或者STOPPED.如果队列是STOPPED状态,那么新应用不会提交到该队列或者子队列。同样,如果root被设置成STOPPED,那么整个集群都不能提交任务了。现有的应用可以等待完成,因此队列可以优雅的退出关闭。

yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications

访问控制列表ACL控制谁可以向该队列提交任务。如果一个用户可以向该队列提交,那么也可以提交任务到它的子队列。

yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue

设置队列的管理员的ACL控制,管理员可以控制队列的所有应用程序。同样,它也具有继承性。

注意:ACL的设置是user1,user2 group1,group2这种格式。如果是则代表任何人。空格表示任何人都不允许。默认是.

其他属性

yarn.scheduler.capacity.resource-calculator

资源计算方法,默认是org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator,它只会计算内存。DominantResourceCalculator则会计算内存和CPU。

yarn.scheduler.capacity.node-locality-delay

调度器尝试进行调度的次数。一般都是跟集群的节点数量有关。默认40(一个机架上的节点数)
一旦设置完这些队列属性,就可以在web ui上看到了。可以访问下面的连接:
xxx:8088/scheduler

修改队列配置

如果想要修改队列或者调度器的配置,可以修改

vi $HADOOP_CONF_DIR/capacity-scheduler.xml

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

$HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues

注意:

  • 队列不能被删除,只能新增。

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

  • 同层级的队列容量限制相加需要等于100%。

  • 如果希望自己的任务调度到queue1队列,只需在启动任务时指定:mapreduce.job.queuename参数为queue1即可,默认为default队列


以上是关于Yarn三种调度策略对比的主要内容,如果未能解决你的问题,请参考以下文章

[Hadoop]-Yarn-调度器篇

Hadoop YARN 调度器(scheduler) —— 资源调度策略

Yarn调度队列

YARN资源调度策略之Capacity Scheduler

YARN资源调度策略之Capacity Scheduler

Yarn调度队列