Hadoop YARN 调度器(scheduler) —— 资源调度策略
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_yarn_resource_scheduler
搜了一些博客,发现写得最清楚的还是《Hadoop权威指南》,以下内容主要来自《Hadoop The Definitive Guide》 4th Edition 2015.3。
Hadoop YARN Scheduler
三个调度器
YARN提供了CapacityScheduler, FairScheduler, FifoScheduler三个调度器,继承于AbstractYarnScheduler,Resource Manager通过调度器决定对提交application分配的资源大小。
CapacityScheduler首先将所有资源分配到hierarchical queue中,每个任务执行时指定对应的queue,使大任务不会占用整个集群的资源,通过对queue的资源管理提高整个集群的资源共享能力。通常会使小任务执行更快,大任务更慢。
Fair Scheduler 会在第一个任务运行时分配当前同级队列的所有资源,当有其它任务运行时,回收前面任务运行时的部分资源(一般为运行完成的Container)用于其它任务。
至于FIFO,源码里都没有描述,可能就是一般的先进先出了。
YARN默认使用CapacityScheduler,通过下面的属性配置:
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
YARN 动态资源分配
YARN 能够动态申请资源,如MapReduce中reduce的container会在map过程结束后申请。但Spark On YARN的机制为申请固定的executor,而不动态改变已申请的资源。
YARN上新运行的任务能够使用已运行任务回收的资源(如运行完Map task的container),甚至还能够通过强行结束先前任务的container抢占资源。
Capacity Scheduler
CapacityScheduler重点解决多个组织共享集群资源,并保证每个组织自己的资源使用量。当自己的资源不足时能够使用其它组织的空闲资源。
资源通过层级队列(hierarchical queues)的形式进行组织,配置在etc/hadoop/capacity-scheduler.xml.
<!-- 队列结构设置 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>a,b</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.a.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.a1.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.a2.capacity</name>
<value>50</value>
</property>
<!-- 最大能力占用 -->
<property>
<name>yarn.scheduler.capacity.root.a.maximum-capacity</name>
<value>75</value>
</property>
root
├── a 40%
| ├── a1 50%
| └── a2 50%
└── b 60%
上面的设置形成了如图的hierarchical queues,并指定a队列使用40%的资源,b队列60%,a1 a2各占a队列的50%,a队列在b队列资源空闲时,最高可占用集群75%的资源。
一些设置和特点
- 通过设置queue的maximum capacity能够避免使用相邻子队列的所有资源。
- 改变文件后需要运行
$HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
- 子队列能使用的最大资源为父队列的资源
- 队列上除了对资源的管理,还提供了运行的用户、应用数量等的限制功能。
- 默认只支持内存,通过配置可以支持CPU
Fair Scheduler (公平调度器)
对比CapacityScheduler的主要区别: 任务提交时占用同一层队列所有的资源 (Capacity Scheduler中只使用maximum-capacity限制下的其它队列闲置的资源),另一个任务提交时,会回收先前任务的部分资源。
<allocations>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queue name="a">
<weight>4</weight>
<schedulingPolicy>fifo</schedulingPolicy>
<queue name="a1" />
<queue name="a2" />
</queue>
<queue name="b">
<weight>6</weight>
</queue>
<queuePlacementPolicy>
<rule name="specified" create="false" />
<rule name="primaryGroup" create="false" />
<rule name="default" queue="a.a1" />
</queuePlacementPolicy>
</allocations>
上面的配置文件给出了一个如下图的层级队列。
root
├── a (权重4 因此占用总体40%的资源)
| ├── a1 没有指定权重,因此与a2队列平分a队列40%的资源;队列内部的多个应用使用fifo策略。
| └── a2
└── b (权重6 因此占用总体60%的资源)
向a1队列中提交任务1时,首先会占用整个集群;向b队列提交任务2时,会从任务1中回收60%的资源用于任务2;向a1队列中继续提交任务3时,会按fifo的策略使用a队列的40%资源;向a2队列提交任务4时,会从a1队列的任务1、任务3中回收资源,使a1队列资源和a2队列相同。
在Hadoop Fair Scheduler的具体实现中,并没有对每个application实现绝对公平的资源分配,而是针对同一级队列内部的资源,队列内部可以选择其它的调度策略。并且使用weight参数,使相同层级的队列资源根据weight分配而非直接平均,设置不同weight后并不“fair”。(实质上和CapacityScheduler类似,都是对层级队列的管理,每一层的队列之间资源存在共享,有博客提到FairScheduler在不断的发展中已经能够实现大部分CapacityScheduler的功能,两者的功能越来越接近)
注意,Fair Scheduler会默认对每个用户创建一个queue用于没指定queue的任务,weight为1,因此要想忽略默认创建的用户queue,需要将权重设置偏大。
队列内部调度策略
每个队列内使用一定的调度策略,常见的FIFO、FAIR和DRF。
FIFO(first in first out), 先提交的任务先分配资源。
FAIR (max-min fairness), 先把资源平均分配,某些任务如果有多出资源则将多出的资源分配给其它任务,对资源要求低的任务优先。
DRF(dominant resource fairness),解决有多种资源(CPU、内存等)同时考虑的分配问题,如一个CPU要求高内存要求低与一个CPU要求低内存要求高的应用。
Hadoop YARN 调度器(scheduler) —— 资源调度策略的更多相关文章
- hadoop之 Yarn 调度器Scheduler详解
概述 集群资源是非常有限的,在多用户.多任务环境下,需要有一个协调者,来保证在有限资源或业务约束下有序调度任务,YARN资源调度器就是这个协调者. YARN调度器有多种实现,自带的调度器为Capaci ...
- Yarn 调度器Scheduler详解
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...
- YARN调度器(Scheduler)详解
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...
- Hadoop Yarn调度器的选择和使用
一.引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色.在讨论其构造器之前先简单了解一下Yarn的架构. 上图是Yarn的基本架构,其中ResourceManager是整个架构的核 ...
- Yarn调度器负载模拟器——Yarn Scheduler Load Simulator (SLS)
一.概述: Yarn调度器有很多实现,如Fifo, Capacity和Fair schedulers等.与其同一时候,正在进行一些优化措施来提高调度器在不同负载和工作场景下的性能.每一个调度器都有自己 ...
- Hadoop的调度器总结
Hadoop的调度器总结 随着MapReduce的流行,其开源实现Hadoop也变得越来越受推崇.在Hadoop系统中,有一个组件非常重要,那就是调度器,它的作用是将系统中空闲的资源按一定策略分配给作 ...
- Hadoop 三大调度器源码分析及编写自己的调度器
如要转载,请注上作者和出处. 由于能力有限,如有错误,请大家指正. 须知: 我们下载的是hadoop-2.7.3-src 源码. 这个版本默认调度器是Capacity调度器. 在2.0.2-alph ...
- Hadoop Capacity调度器概念及配置
在Yarn框架中,调度器是一块很重要的内容.有了合适的调度规则,就可以保证多个应用可以在同一时间有条不紊的工作.最原始的调度规则就是FIFO,即按照用户提交任务的时间来决定哪个任务先执行,但是这样很可 ...
- 7.k8s.调度器scheduler 亲和性、污点
#k8s. 调度器scheduler 亲和性.污点 默认调度过程:预选 Predicates (过滤节点) --> 优选 Priorities(优先级排序) --> 优先级最高节点 实际使 ...
随机推荐
- 前端开发 Vue -4promise解读2
https://www.runoob.com/vue2/vue-tutorial.html promise promise是什么? 1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执 ...
- 【转载】Windows检测到IP地址冲突
今天在使用电脑的过程中,突然弹出个提示,Windows检测到IP地址冲突,此网络中的另一台计算机与该计算机的IP地址相同.联系你的网络管理员解决此问题,有关详细信息,请参阅Windows系统日志.查阅 ...
- 清楚html和css标签自带默认样式
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...
- BPM业务流程管理系统_K2受邀出席QAD客户日活动,赋能企业云端智造_工作流引擎
10月17日,K2受邀参加由厦门易维主办的以“走进QAD云ERP,深耕智能制造”为主题的QAD客户日活动.本次大会是以工业4.0背景下传统制造业面临巨大压力和挑战为导向,旨在探讨如何助力企业迅速适应业 ...
- Vue框架之vuex的使用
1.首先需要在你的项目目录下安装vuex 终端命令: 2.在全局组件中导入与声明vuex 3.创建store实例对象 let store = new Vuex.store({ state:{ }, m ...
- [dev][ipsec][esp] ipsec链路中断的感知问题
ipsec如何感知到链路中断了?以下内容讲的是在没有配置DPD,且没有rekey的场 景下. 1. ESP认为,以下两个场景交由应用层来感知,应用层会发现ipsec的连接坏掉了. a,ESP承载的连接 ...
- Bash基础——命令替换
参考:Linux 下Shell 脚本几种基本命令替换区别 Command substitution 命令替换Command substitution https://www.jb51.net/arti ...
- linux下环境管理anaconda3
我之前在centos之安装单独python3.6,大家都知道centos自带python2.7,通过输入python,和python3来控制想要使用python2,或者python3,如今想要要在li ...
- python学习之模块导入,操作邮件,redis
python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...
- Docker那些事儿之初识Docker
公司内部一直在使用Docker进行服务的部署和应用的升级,从开始使用Docker一直到线上的部署以及一些基础服务的开发本人都有参与,而且自己的网站也是在Docker的基础之上进行构建的,想想也需要总结 ...