引言

在Yarn体系中,Scheduler负责为Application分配资源,按照调度策略可分为以下3种:

  • FIFO Scheduler
  • Capacity Scheduler
  • Fair Scheduler


下面具体介绍上述3种调度器:

FIFO Scheduler

顾名思义,该调度器是按照应用的提交顺序分配资源的,先进先出,优先满足先到达的应用,待前面的应用所需资源满足后再分配后面的应用。

在共享集群模式下,该模式会存在应用饥饿问题,即小应用会被前面的大应用阻塞,当前面存在某个大应用耗尽所有资源,会导致后续的应用永远得不到执行。

Capacity Scheduler

概述

由引言中的图易知,Capacity调度器将整个集群的资源分为多个Queue,每个Queue可占用一定的集群资源,应用可提交到指定的Queue上,在每个Queue内部,执行的仍然是FIFO策略。

当某个Queue因为被提交了多个Application而导致资源告急时,Capacity调度器扔可能分配部分资源给当前队列,但前提是其他队列有剩余,或其他队列释放了某些Container资源。

为避免某队列占用过多的空闲资源,导致其他队列无法使用这些空闲资源,建议设置队列的最大资源使用量。

配置

Capacity Schduler是YARN中默认的资源调度器。

在Capacity Scheduler的配置文件中,队列queueX的参数Y的配置名称为yarn.scheduler.capacity.queueX.Y,为了简单起见,我们记为Y,则每个队列可以配置的参数如下:

资源分配相关参数

  • capacity

队列的资源容量(百分比)。 当系统非常繁忙时,应保证每个队列的容量得到满足,而如果每个队列应用程序较少,可将剩余资源共享给其他队列。注意,所有队列的容量之和应小于100。

  • maximum-capacity

队列的资源使用上限(百分比)。由于存在资源共享,因此一个队列使用的资源量可能超过其容量,而最多使用资源量可通过该参数限制。

  • minimum-user-limit-percent

每个用户最低资源保障(百分比)。任何时刻,一个队列中每个用户可使用的资源量均有一定的限制。当一个队列中同时运行多个用户的应用程序时中,每个用户的使用资源量在一个最小值和最大值之间浮动,其中,最小值取决于正在运行的应用程序数目,而最大值则由minimum-user-limit-percent决定。比如,假设minimum-user-limit-percent为25。当两个用户向该队列提交应用程序时,每个用户可使用资源量不能超过50%,如果三个用户提交应用程序,则每个用户可使用资源量不能超多33%,如果四个或者更多用户提交应用程序,则每个用户可用资源量不能超过25%。

  • user-limit-factor

每个用户最多可使用的资源量(百分比)。比如,假设该值为30,则任何时刻,每个用户使用的资源量不能超过该队列容量的30%。

限制应用程序数目相关参数

  • maximum-applications

集群或者队列中同时处于等待和运行状态的应用程序数目上限,这是一个强限制,一旦集群中应用程序数目超过该上限,后续提交的应用程序将被拒绝,默认值为10000。所有队列的数目上限可通过参数yarn.scheduler.capacity.maximum-applications设置(可看做默认值),而单个队列可通过参数yarn.scheduler.capacity..maximum-applications设置适合自己的值。

  • maximum-am-resource-percent

集群中用于运行应用程序ApplicationMaster的资源比例上限,该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,默认是0.1,表示10%。所有队列的ApplicationMaster资源比例上限可通过参数yarn.scheduler.capacity. maximum-am-resource-percent设置(可看做默认值),而单个队列可通过参数yarn.scheduler.capacity.. maximum-am-resource-percent设置适合自己的值。

队列访问和权限控制参数

  • state

队列状态可以为STOPPED或者RUNNING,如果一个队列处于STOPPED状态,用户不可以将应用程序提交到该队列或者它的子队列中,类似的,如果ROOT队列处于STOPPED状态,用户不可以向集群中提交应用程序,但正在运行的应用程序仍可以正常运行结束,以便队列可以优雅地退出。

  • acl_submit_applications

限定哪些用户/用户组可向给定队列中提交应用程序。需要注意的是,该属性具有继承性,即如果一个用户可以向某个队列中提交应用程序,则它可以向它的所有子队列中提交应用程序。

  • acl_administer_queue

为队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等。同样,该属性具有继承性,如果一个用户可以向某个队列中提交应用程序,则它可以向它的所有子队列中提交应用程序。

实例

<configuration><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>集群中可用于运行application master的资源比例上限,这通常用于限制并发运行的应用程序数目。</description></property><property><name>yarn.scheduler.capacity.root.queues</name><value>default</value><description>root队列的所有子队列,该实例中只有一个</description></property><property><name>yarn.scheduler.capacity.root.default.capacity</name><value>100</value><description>default队列的资源容量</description></property><property><name>yarn.scheduler.capacity.root.default.user-limit-factor</name><value>1</value><description>每个用户可使用的资源限制</description></property><property><name>yarn.scheduler.capacity.root.default.maximum-capacity</name><value>100</value><description>Default队列可使用的资源上限. </description></property><property><name>yarn.scheduler.capacity.root.default.state</name><value>RUNNING</value><description>Default队列的状态,可以是RUNNING或者STOPPED.</description></property><property><name>yarn.scheduler.capacity.root.default.acl_submit_applications</name><value>*</value><description>限制哪些用户可向default队列中提交应用程序.</description></property><property><name>yarn.scheduler.capacity.root.default.acl_administer_queue</name><value>*</value><description>限制哪些用户可管理default队列中的应用程序,“*”表示任意用户</description></property><property><name>yarn.scheduler.capacity.node-locality-delay</name><value>-1</value><description>调度器尝试调度一个rack-local container之前,最多跳过的调度机会,通常而言,该值被设置成集群中机架数目,默认情况下为-1,表示不启用该功能。</description></property>
</configuration>

Fair Scheduler

概述

Fair调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置),用户在各自队列运行中逐渐资源变得平分。

假如现在存在大、小2个任务,当提交大任务时,其会获取所有的系统资源,大任务执行期间,当小任务提交时,大任务会释放出一半数量的Container供小任务使用,待小任务执行完毕后,小任务会释放其所占有的资源,此时大任务重新获取到系统的所有资源。

因为小任务需要等待大任务释放出Container,所以从小任务提交到获取到资源会有一定的延迟,但确实值得的。

该种模式下,即保证了资源的高利用率又使得晚提交的小任务获得执行的机会,不至于饿死。

配置

首先在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

可向队列中提交应用程序的用户列表,默认情况下为"*",表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。

  • aclAdministerApps

该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。

管理员也可为单个用户添加maxRunningJobs属性限制其最多同时运行的应用程序数目。此外,管理员也可通过以下参数设置以上属性的默认值:

  • userMaxJobsDefault

用户的maxRunningJobs属性的默认值。

  • defaultMinSharePreemptionTimeout

队列的minSharePreemptionTimeout属性的默认值。

  • defaultPoolSchedulingMode

队列的schedulingMode属性的默认值。

  • fairSharePreemptionTimeout

公平共享量抢占时间。如果一个资源池在该时间内使用资源量一直低于公平共享量的一半,则开始抢占资源。

实例

假设要为一个Hadoop集群设置三个队列queueA、queueB和queueC,其中,queueB和queueC为queueA的子队列,且规定普通用户最多可同时运行40个应用程序,但用户userA最多可同时运行400个应用程序,那么可在自定义配置文件中进行如下设置:

<allocations><queue name=”queueA”><minResources>100 mb, 100 vcores</minResources><maxResources>150 mb, 150 vcores</maxResources><maxRunningApps>200</maxRunningApps><minSharePreemptionTimeout>300</minSharePreemptionTimeout><weight>1.0</weight><queue name=”queueB”><minResources>30 mb, 30 vcores</minResources><maxResources>50 mb, 50 vcores</maxResources></queue><queue name=”queueC”><minResources>50 mb, 50 vcores</minResources><maxResources>50 mb, 50 vcores</maxResources></queue></queue><user name=”userA”><maxRunningApps>400</maxRunningApps></user><userMaxAppsDefault>40</userMaxAppsDefault><fairSharePreemptionTimeout>6000</fairSharePreemptionTimeout>
</allocations>

配置Example

<?xml version="1.0"?>
<allocations><queue name="sample_queue"><minResources>10000 mb,0vcores</minResources><maxResources>90000 mb,0vcores</maxResources><maxRunningApps>50</maxRunningApps><maxAMShare>0.1</maxAMShare><!--设置权重 40%--><weight>2.0</weight><!--调度策略--><schedulingPolicy>fair</schedulingPolicy><queue name="sample_sub_queue"><aclSubmitApps>charlie</aclSubmitApps><minResources>5000 mb,0vcores</minResources></queue><queue name="sample_reservable_queue"><reservation></reservation></queue></queue><queueMaxAMShareDefault>0.5</queueMaxAMShareDefault><queueMaxResourcesDefault>40000 mb,0vcores</queueMaxResourcesDefault><!-- Queue 'secondary_group_queue' is a parent queue and may haveuser queues under it --><queue name="secondary_group_queue" type="parent"><!--设置权重 60%--><weight>3.0</weight><maxChildResources>4096 mb,4vcores</maxChildResources></queue><user name="sample_user"><maxRunningApps>30</maxRunningApps></user><userMaxAppsDefault>5</userMaxAppsDefault><queuePlacementPolicy><!--若提交的任务指定了队列名,则放入指定队列--><rule name="specified" /><!--尝试将任务提交到名称为用户名的队列,若不存在与当前用户名相同的队列,则转入下一个规则--><rule name="primaryGroup" create="false" /><rule name="nestedUserQueue"><rule name="secondaryGroupExistingQueue" create="false" /></rule><!--前面均不匹配,则放入默认队列sample_queue--><rule name="default" queue="sample_queue"/></queuePlacementPolicy>
</allocations>

抢占

Fair调度器支持抢占,抢占就是允许调度器杀掉占用超过其应占份额资源队列的containers,这些containers资源便可被分配到应该享有这些份额资源的队列中。需要注意抢占会降低集群的执行效率,因为被终止的containers需要被重新执行。

可以通过设置一个全局的参数yarn.scheduler.fair.preemption=true来启用抢占功能。

参考文献:

  1. https://www.jianshu.com/p/8738acc89bd4
  2. http://www.imooc.com/article/253999

Yarn的调度器--Scheduler探究相关推荐

  1. Yarn公平调度器[转自 AIMP平台wiki]

    Yarn公平调度器 默认,基于内存做公平调度.可以配置成基于内存和CPU. 只有一个作业时,它使用整个系统的资源:新的作业提交后,被释放的资源就会分配给它,最终每个作业获得同样的资源. 这会让短时作业 ...

  2. Vue3 生命周期Hooks函数与调度器Scheduler的原理

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 写在最前:本文章的目标 Vue3的生命周期的实现原理是比较简单的,但要理解整个Vue3的生命 ...

  3. Yarn 组件的指挥部 – 调度器Scheduler

    linux基础 为hadoop集群的搭建扫清了障碍,也为内存的管理,文件系统的管理扫清了障碍 接着到Hadoop的阶段,首先做集群的安装,深入到使用这两个核心的组件,分布式文件系统HDFS,解决大量数 ...

  4. 大数据之Yarn——Capacity调度器概念以及配置

    试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...

  5. 先来先服务算法、运行时间最短者优先算法和最高响应比优先调度算法_CPU的调度器scheduler...

    处理器作为计算机系统里的一种资源,也是需要管理,从而调度分配给需要的程序以达到最高效率,所以调度器应运而生. 1. 调度器overview 调度器本身也是一个程序,目的是为了给执行用户的程序提供资源, ...

  6. k8s-------(| 五 |)调度器 scheduler,亲和(affinity),污点(taint),容忍(tolerations),标签labels

    文章目录 一.调度说明 1. 简介 2. 调度过程 3. 自定义调度器 二.调度亲和性 1. node节点亲和性 (1)硬策略 (2)软策略 (3)硬策略与软策略 (4)节点标签相关操作 2. Pod ...

  7. Hadoop yarn容量调度器capacity-scheduler.xml配置示例

    配置多队列hive队列和default队列 <configuration>......<property><name>yarn.scheduler.capacity ...

  8. Hadoop Yarn公平调度器的特点、缺额、DRF策略

    特点 缺额 队列资源分配方式 队列资源分配算法 作业资源分配 DRF策略

  9. Hadoop Yarn容量调度器特点和分配算法介绍

    特点 分配算法

最新文章

  1. nginx模型概念和配置文件结构
  2. matlab模拟塞曼图谱,塞曼效应以及能级的计算
  3. android虚拟机下载地址,12bet备用网址「永久地址0365.tv」android虚拟机下载在虚拟机中安装Android 操作系统...
  4. hadoop(9)--MapReduce入门WordCount
  5. 人们通常先在线性表尾部临时添加一个_数据结构学习笔记-线性表
  6. Errors running builder 'DeploymentBuilder' on project '工程名'
  7. [转帖]Report painter
  8. pcb中layer stack manager 中,右上角的layer pairs 、internal layer pairs和build-up,三者的区别?
  9. C和指针之编译出现warning: implicit declaration of function ‘matrix_multiply‘ is invalid in C99问题
  10. px是什么意思计算机二级,px是什么意思?照片中的px是什么的缩写?
  11. 【转】%~dp0是什么意思
  12. android 混合现实,基于Android的增强现实客户端的设计与实现
  13. Ubuntu18.04安装windows依赖库(winetricks)
  14. 操作系统课设 Nachos 实验一:Nachos 系统的安装与调试
  15. cesium加载倾斜优化_干货 | 6款倾斜摄影裸眼3D采集软件推荐给大家
  16. C语言,使用结构体读入两个在同一年的日期,判断日期是否合法,并计算两个日期之间相差的天数。结构体定义如下:...
  17. axure手机页面设计说明_产品经理原型演示——Axure制作手机登陆界面
  18. CCF-CSP 201912-1 报数(python实现)
  19. 绿米Aara单火开关,ZigBee智能开关和单火线取电技术, 对于单火取电电源和ZIGBEE缩合分析
  20. 玩转华为数据中心交换机系列 | 配置STP功能示例

热门文章

  1. stm32 I2C、EEPROM
  2. 小晶粒zsm分子筛合成表征实验报告_ZSM-5分子筛的合成与表征
  3. Rockchip RV1126 模型部署(完整部署流程)
  4. html中position属性默认值,CSS position 属性总结
  5. 15、DOM常见的操作方式
  6. [人工智能学习日志]深度学习-股票价格预测案例1
  7. 如何在VBA中实现工作表函数SIGN
  8. openssl生成证书链多级证书、证书吊销列表(CRL)
  9. iOS音频——使用OpenAL API
  10. r5 3600和r5 5600x选哪个