一、概述

公平调度器可以为所有的应用“平均公平”分配资源,当然,这种“公平”是可以配置的,称为权重,可以在分配文件中为每一个队列设置分配资源的权重,如果没有设置,默认是1(由于默认权重相同,因此,在不做配置的情况下,作业(队列)之间的资源占比相同)。

默认地,所有的应用程序在一段时间内平均获得相等的资源份额;

默认地,公平调度程序仅基于内存调度公平决策,当然,这种策略也是支持配置的。

其策略如下图所示:

紫色区域代表任务A, 绿色区域代表任务B,当只有一个应用程序(A)在运行时,该应用程序将使用整个集群的资源(0  ~ t1时间段)。当提交其他应用程序时(t1时刻),A释放的资源被分配给新应用程序,因此每个应用程序最终得到的资源大致相同(在默认情况下)。当任务B执行完后(t2时刻),B所占用的资源又会被A使用,此后A又将完全占用集群资源直至任务结束。

相比较容量调度器,公平调度器并不会为某个队列预留资源,调度器会在所有正在运行的作业之间动态平衡集群资源。公平调度器的这种机制不光实现应用之间的公平分配资源,也可以实现在多队列之间,因为公平调度器也支持多层级队列。但是公平规则只限于同级队列。例如:默认配置下,队列A、B,A启动一个作业,此时A占用100%资源,过一段时间,B队列启动一个作业b1,而后A、B将平分资源,各占50%,如果此时B队列又启动了一个作业b2,那么b1、b2将各占队列B的50%资源,即a1作业占系统资源的50%,b1、b2各占系统资源的25%。

二、配置

1. 指定调度器

位置:$HADOOP_HOME/etc/hadoop/yarn-site.xml

添加配置:

key: yarn.resourcemanager.scheduler.class

value: org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

2. 定义分配文件

位置:$HADOOP_HOME/etc/hadoop/fair-scheduler.xml

队列结构:

(root)

--general

--dev

--mr

--azkaban

队列元素使用<queue/>来定义,权重使用其子元素<weight/>定义,上面的结构在配置文件中如下:

  <queue name="general"><weight>2</weight><schedulingPolicy>fifo</schedulingPolicy></queue><queue name="dev"><weight>8</weight><queue name="mr"></queue><queue name="azkaban"></queue><schedulingPolicy>drf</schedulingPolicy></queue>

该配置文件中,队列general占用资源权重20%,dev队列占用权重80%,也就是说,如果集群资源分配比例是1:4,那么此时就认为是公平的。对于dev的子队列mr和azkaban,由于没有分配权重,因此默认都是1,也就是说,mr和azkaban队列平分dev的资源。

每个队列可以拥有自己的调度策略,可选值又fifo、fair(默认)、drf,可以使用<queue/>的子元素<schedulingPolicy/>定义。

和容量调度器相同,公平调度器也可以配置最大(<queue/>子元素<maxResources/>)、最小资源(<queue/>子元素<minResources/>)以及最大可运行应用数量(<queue/>子元素<maxRunningApps/>),其中最小资源可以确保特定用户、群组或生产应用程序总能获取到足够的资源时是很有用的。当一个资源池包含作业时,它至少能获取到它的最小共享资源,但是当资源池不完全需要它所拥有的保证共享资源时,额外的部分会在其它资源池间进行切分(摘自 hadoop2配置公平调度器)。

配置好后,进入YARN的控制台,如图所示:

三、队列放置

不同于容量调度器,公平调度器设计了一个基于规则的系统来为作业分配调度队列,它内置了一套规则可以插拔式的配置。定义分配规则使用<queuePlacementPolicy/>标签,具体条件使用<rule/>定义,例如:

  <queuePlacementPolicy><rule name="specified" create="false"></rule><rule name="primaryGroup" create="false"></rule><rule name="user" create="false"></rule><rule name="default" queue="general"></rule></queuePlacementPolicy>

我们可以将<rule>视为web中的过滤器,当对作业进行分配的时候,系统会从上到下一次匹配,例如上面的配置,specified表示在提交作业的时候指定了队列,primaryGroup指的是用户所在unix用户组(组名)的队列,user值得是用户名为命名的队列,default规则是兜底规则,若以上都不匹配,则放到general队列。

create属性指定是,若匹配到已经存在的队列,则将作业放到改队列,若匹配不到已经存在的队列,则根据create来选择是否创建队列,默认值是true。例如,若<rule name="user" create=true/>,此时用户user1提交作业,调度器就会寻找是否又名字为user1的队列,若没有,就会创建名字为user1的队列,并将这个作业放到该队列中。

若不显示地配置<queuePlacementPolicy/>,则调度器将使用如下默认的配置:

  <queuePlacementPolicy><rule name="specified"></rule><rule name="user"></rule></queuePlacementPolicy>

也就是说,除非显示地指明所用队列,否则按照提交作业的用户名为名加入队列中。

四、抢占

与容量调度器不通,公平调度器拥有抢占机制。当提交一个作业的时候,如果资源紧张,则作业会等待其他作业资源释放后再执行,这个等待时间可以使用抢占功能进行控制。

抢占指的是,调度器允许终止哪些占用资源高于公平状态下应分配的资源,从而释放资源给哪些占用资源小于公平状态下应分配资源的作业。
1. 开启抢占模式:

yarn.scheduler.fair.preemption=true

2. 抢占机制主要设置:

最小共享:指的是在这个时间内,没有获得设置的最小资源值,则会抢占其他容器资源。

配置:

方式1:顶层元素<defaultMinSharePreemptionTimeout/>,单位秒,可以为所有队列设置。

方式2:<queue/>子元素<minSharePreemptionTimeout>,单位秒,单独为某个队列设置。

显而易见,该种方式需要队列的最小资源设置配合。

公平共享:指的是在这个时间内,没有获得公平状态下的资源值的一半,则抢占其他容器资源。

配置:

方式1:顶层元素<defaultFairSharePreemptionTimeout/>,单位秒,可以为所有队列设置。

方式2:<queue/>子元素<fairSharePreemptionTimeout>,单位秒,单独为某个队列设置。

需要注意的是,抢占功能本身虽然会减少作业执行的延迟时间,但是会降低整个集群的效率,因为被抢占的作业会终止运行,最终会重新开始执行。

五、总结

公平调度器实现了较高的集群利用率,同时保证小作业能即使完成。

YARN中的任务队列调度器-公平调度器(Fair Scheduler)相关推荐

  1. 在C#中引入延迟计算和公平调度

    目录 介绍 延迟计算 公平调度 公平线程池 下载源代码 - 9.3 KB 介绍 本文简要介绍了C中的延迟计算和公平调度的概念. 延迟计算 延迟计算(懒惰计算)是一种计算策略,它将表达式的计算延迟到需要 ...

  2. YARN中的任务队列调度器-容量调度器(Capacity Scheduler)

    一.概述 容量调度器是YARN提供的三种调度器中的一种,这种调度器允许多个组织(队列)共享一个Hadoop集群,每个组织(队列)所分配的集群资源是固定的且可配置的.每个组织(队列)内部还可以进一步划分 ...

  3. CDH Yarn资源动态分配 - 指定资源限制 公平调度具体设置

    日常工作中会涉及到各种资源分配等问题,跨部门,跨业务等等,这里介绍基于CDH版本的Yarn 公平调度(实际使用DRF调度) 不同时间配置不同资源参考(计划模式):https://datamining. ...

  4. 别被官方文档迷惑了!这篇文章帮你详解yarn公平调度

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由@edwinhzhang发表于云+社区专栏 FairScheduler是yarn常用的调度器,但是仅仅参考官方文档,有很多参数和概念文 ...

  5. 【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 | 五种调度类 )

    文章目录 一.CFS 调度器概念 ( 完全公平调度器 ) 二.CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三.进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实 ...

  6. 大数据之-Hadoop3.x_Yarn_公平调度器---大数据之hadoop3.x工作笔记0146

    然后我们再来看公平调度器,公平调度器是facebook开发的一个调度器, 上面的容量调度器是雅虎开发的对吧. 然后我们看看公平调度器的特点,可以看到,它要做到的就是公平,他也可以有多个队列,但是同一个 ...

  7. 【Linux 内核】CFS 调度器 ⑤ ( CFS 调度器类 fair_sched_class 源码 | next 赋值 | enqueue_task 赋值 | dequeue_task 赋值 )

    文章目录 一.调度器类 sched_class 简介 二.CFS 调度器类源码 三.next 赋值 四.enqueue_task 赋值 五.dequeue_task 赋值 一.调度器类 sched_c ...

  8. Linux---进程调度及CFS调度器

    Linux的调度算法 (1)O(N)调度器 O(N)调度器发布于1992年,从就绪队列中比较所有进程的优先级,然后选择一个最高优先级的进程作为下一个调度进程. 优点:操作简单,便于理解. 缺点:时间消 ...

  9. 【Linux 内核】实时调度类 ③ ( 实时调度类 rt_sched_class 源码 | 调度类 sched_class 源码 )

    文章目录 一.调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) 二. 实时调度类 rt_sched_class 源码 一.调度类 ( 停机调度类 | 限期调度 ...

最新文章

  1. 首发|机器学习未来十年:你需要把握的趋势和热点
  2. python检索地址_35.leetcode题目讲解(Python): 搜索插入位置
  3. Windows驱动开发-_驱动对象学习和内核处理字符串初步
  4. 关于保存到session里的信息
  5. vim之terminal之窗口大小命令
  6. 百度音乐接口使用示例
  7. 服务器端大文件如何传给客户端,客户端往服务器传文件
  8. 一定要好好学习C语言
  9. mysql redo原子写_InnoDB如何保证redolog的完整性?
  10. 和合符放枕头下的作用_深度解析:记忆棉枕头好,还是乳胶枕头好?
  11. ubuntu搭建php开发环境记录
  12. Vue.js 2.5 发布,而这个会玩的团队已经自研出用 Vue 开发小程序的框架了
  13. java基础--接口
  14. Java新手编程入门
  15. 关于桌面运维工程师的错题本(前言)
  16. python删除word表格中的某一行_python读取word 中指定位置的表格及表格数据
  17. 2017年6月英语 CET 四六级考试查询准考证方法
  18. J-Link 下载程序 接线图
  19. 计算机图形学 绘制正四面体
  20. vscode 设置用户代码片段(怎么用命令式快速生成一段代码)

热门文章

  1. 好数对的数目(C++)
  2. 跟相亲对象微信聊什么?聊天绝学四步走一试便知有没有
  3. 关于整合ssh的问题,新人求关照
  4. Cadence OrCAD Capture CIS 输出带属性的PDF原理图
  5. 企业快速寄件打单教程
  6. luckysheet+luckyexcel在线预览excel
  7. 信用卡不激活到底会怎样?会有哪些负面影响呢?
  8. 挑战52天背完小猪佩奇(第02天)
  9. 计算机网络的基础知识
  10. 【单调队列】51nod 1275 连续子段的差异