YARN资源调度策略之Fair Scheduler

非 Y 不嫁゛ 提交于 2020-01-30 18:56:17

目的

这篇文章是对公平调度器(FairScheduler)的说明,它是hadoop的一个可插拔的调度器,目的是让应用程序在YARN上能够公平的共享巨大的集群资源。

介绍

公平调度是一种将资源分配给应用程序的方法,这样所有应用程序平均都能在一段时间内获得相同的资源份额。Hadoop NextGen能够调度多个资源类型。默认情况下,Fair调度器仅基于内存来进行公平性决策。利用Ghodsi等人提出的占主导地位的资源公平性概念,可以将其配置为同时使用内存和CPU进行调度。当只有一个应用程序运行时,该应用程序将使用整个群集资源。当其他应用被提交时,释放的资源被分配给新的应用,这样每个应用最终获得的资源量大致相同。与默认的Hadoop调度程序(它构造一个应用程序队列)不同,它允许小的应用程序在合理的时间内完成,而不会使耗时长的应用挨饿。这也是在多个用户之间共享集群的合理方法。最后,公平分享也可以与应用程序优先级一起工作-优先级被用作权重,以确定每个应用程序应获得的总资源的百分比。

调度程序将应用程序进一步组织到“队列”中,并在这些队列之间公平地共享资源。默认情况下,所有用户共享一个名为“default”的队列。如果应用程序在容器资源请求中明确列出队列,则请求将提交到该队列。还可以通过配置根据请求中包含的用户名分配队列。在每个队列中,调度策略用于在运行的应用程序之间共享资源。默认情况下是基于内存的公平共享,但也可以配置具有主要资源公平性的FIFO和多资源共享策略。队列可以按层次结构排列以划分资源,并配置权重以按特定比例共享集群。

除了提供公平共享外,公平调度程序还允许将保证的最小资源分配给队列,这对于确保某些用户、组或生产应用程序始终获得足够的资源非常有用。当队列包含应用程序时,它至少获得其最小共享,但当队列不需要其完全保证的共享时,多余的部分将在其他正在运行的应用程序之间分配。这样,当队列不包含应用程序时,调度器可以保证队列的容量,同时有效地利用资源。

Fair调度程序允许默认情况下运行所有应用程序,但也可以通过配置文件限制每个用户和每个队列运行的应用程序数。当用户必须一次提交数百个应用程序时,这可能很有用;如果同时运行太多应用程序会导致创建太多中间数据或切换太多上下文,这通常可以提高性能。限制应用不会导致任何随后提交的应用失败,只会在计划程序队列中等待,直到用户的某些早期应用完成。

具备可插拔策略的分层队列

fair调度程序支持分层队列。所有队列的根是“root”。可用资源以典型的公平调度方式分布在根队列的子队列中。然后,子队列以同样的方式将分配给他们的资源分配给他们的下级队列。应用程序只能在叶队列上调度。通过将队列作为其父队列的子元素放置在公平调度程序分配文件中,可以将队列指定为其他队列的子队列。

队列的名称以其父队列的名称开头,句点作为分隔符。因此,根队列下名为“queue1”的队列称为“root.queue1”,名为“parent1”的队列下名为“queue2”的队列称为“root.parent1.queue2”。当引用队列时,名称的根部分是可选的,因此queue1可以被称为“queue1”,queue2可以被称为“parent1.queue2”。

此外,fair调度器允许为每个队列设置不同的自定义策略,以允许以用户希望的任何方式共享队列的资源。可以通过扩展org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy来构建自定义策略。FifoPolicy、FairSharePolicy(默认)和DominantResourceFairnessPolicy都是内置的,可以随时使用。

在原始(MR1)公平调度程序中还没有支持某些附加项。其中之一,是使用一种自定义策略来管理优先“提升”某些应用程序。

自动将应用程序放入队列

Fair调度程序允许管理员配置策略,以便自动将提交的应用程序放置到适当的队列中。程序具体放入哪个队列取决于提交者的用户(user)和组(group)以及应用程序传递的请求队列名。策略由一组有顺序的规则组成,这些规则用于对传入的应用程序进行分类。每个规则要么将应用放入队列,要么拒绝它,要么继续下一个规则。有关如何配置这些策略,请参阅下面的分配文件格式。

安装

要使用Fair调度程序,请首先在yarn-site.xml中分配适当的调度程序类:

<property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

Fair Scheduler相关参数

本节的参数需要在yarn-site.xml中,将配置参数yarn.resourcemanager.scheduler.class设置为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler 才会生效。Fair Scheduler的配置选项包括两部分,其中一部分在yarn-site.xml中,主要用于配置调度器级别的参数,另外一部分在一个自定义配置文件(默认是fair-scheduler.xml)中,主要用于配置各个队列的资源量、权重等信息。

yarn-site.xml

参数名称 说明 缺省值
yarn.scheduler.fair.allocation.file 自定义XML配置文件所在位置,该文件主要用于描述各个队列的属性,比如资源量、权重等,具体配置格式将在后面介绍。
yarn.scheduler.fair.user-as-default-queue 当应用程序未指定队列名时,是否指定用户名作为应用程序所在的队列名。如果设置为false或者未设置,所有未知队列的应用程序将被提交到default队列中 true
yarn.scheduler.fair.preemption 是否启用抢占机制 false
yarn.scheduler.fair.sizebasedweight 在一个队列内部分配资源时,默认情况下,采用公平轮询的方法将资源分配各各个应用程序,而该参数则提供了另外一种资源分配方式:按照应用程序资源需求数目分配资源,即需求资源数量越多,分配的资源越多。 false
yarn.scheduler.assignmultiple 是否启动批量分配功能。当一个节点出现大量资源时,可以一次分配完成,也可以多次分配完成。 false
yarn.scheduler.fair.max.assign 如果开启批量分配功能,可指定一次分配的container数目。 -1,表示不限制。
yarn.scheduler.fair.locality.threshold.node 当应用程序请求某个节点上资源时,它可以接受的可跳过的最大资源调度机会。当按照分配策略,可将一个节点上的资源分配给某个应用程序时,如果该节点不是应用程序期望的节点,可选择跳过该分配机会暂时将资源分配给其他应用程序,直到出现满足该应用程序需的节点资源出现。通常而言,一次心跳代表一次调度机会,而该参数则表示跳过调度机会占节点总数的比例 -1.0,表示不跳过任何调度机会
yarn.scheduler.fair.locality.threshold.rack 当应用程序请求某个机架上资源时,它可以接受的可跳过的最大资源调度机会。
yarn.scheduler.increment-allocation-mb 内存规整化单位 默认是1024,这意味着,如果一个Container请求资源是1.5GB,则将被调度器规整化为ceiling(1.5 GB / 1GB) * 1G=2GB。
yarn.scheduler.increment-allocation-vcores 虚拟CPU规整化单位 默认是1,含义与内存规整化单位类似。

自定义配置文件

Fair Scheduler允许用户将队列信息专门放到一个配置文件(默认是fair-scheduler.xml),对于每个队列,管理员可配置以下几个选项:

参数名称 说明 缺省值
minResources 最少资源保证量,设置格式为“X mb, Y vcores”,当一个队列的最少资源保证量未满足时,它将优先于其他同级队列获得资源,对于不同的调度策略(后面会详细介绍),最少资源保证量的含义不同,对于fair策略,则只考虑内存资源,即如果一个队列使用的内存资源超过了它的最少资源量,则认为它已得到了满足;对于drf策略,则考虑主资源使用的资源量,即如果一个队列的主资源量超过它的最少资源量,则认为它已得到了满足。
maxResources 最多可以使用的资源量,fair scheduler会保证每个队列使用的资源量不会超过该队列的最多可使用资源量。
maxRunningApps 最多同时运行的应用程序数目。通过限制该数目,可防止超量Map Task同时运行时产生的中间输出结果撑爆磁盘。
minSharePreemptionTimeout 最小共享量抢占时间。如果一个资源池在该时间内使用的资源量一直低于最小资源量,则开始抢占资源。
schedulingMode/schedulingPolicy 队列采用的调度模式,可以是fifo、fair或者drf。
aclSubmitApps 可向队列中提交应用程序的Linux用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。
aclAdministerApps 该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。

官方文档:https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!