Yarn源码分析6-Reserve机制
《Hadoop技术内幕-深入解析YARN架构设计与实现原理》学习笔记。 (Yarn源码基于Hadoop 3.1.0)
2018-07-17
前面的源码分析中[Yarn源码分析5-资源调度]讲述了整个调度的主干流程,但是很多分支并没有介绍,比如抢占机制、预约(reserve)机制、ContinueAssigning机制等,这篇文章具体介绍一下reserve机制。
1. 简介
当单个节点的闲置资源无法满足一个container的申请尺寸时,有两种策略:
- 放弃当前节点等待下一个节点
- 在当前节点上预留一个Container申请,等到节点有资源时优先满足预留,节点在满足此预留之前不能满足其它请求
这两种机制都有优缺点:
- 对于直接放弃的方案,可能会导致应用等待过久才能得到满足
- 对于预留的方案,会导致等待时间内的资源浪费,从而降低了资源利用率。
Yarn使用了预留的方案,也就是reserve的方案,这种方案会降低集群的资源利用率,但是可以保证一些container尺寸比较大的请求能得到公平的对待。下面从源码层面分析一下这个机制。
2. 从心跳开始
根据之前的调度主流程分析,节点的心跳到达时,会由FairScheduler的nodeUpdate(RMNode nm)进行处理,然后会调用到attemptScheduling(fsNode)方法,我们直接从这里开始。
1 | //位置:org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java |
对于分析reserve机制,这里有个分叉:
- 检查是否有合法的Reservation,如果有就进行资源分配,调度结束
- 如果没有合法的Reservation,就进入后续的调度流程,但是后续调度流程中,有可能会分配一个Reservation
虽然代码中是Reservation的分配在前,创造Reservation在后面,但是这显然不是逻辑上的时间顺序,下面按照正常的时间顺序来分析一下这个过程:先分析创造一个Reservation的过程,再分析Reservation的分配过程。
3. Reservation的创造
先假设这次心跳中validReservation为false,进入后续的调度流程,根据之前的分析,通过几个跳转之后,会进入到FSAppAttempt中的assignContainer(FSSchedulerNode node),下面从这里开始:
1 | //位置:org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java |
这个方法中主要是判定是否超过针对AM资源使用配置的限制,值得注意的是最后一行中调用的方法return assignContainer(node, false)中的false代表的是当前的这个节点没有已经被分配了reserved的container。
1 | //位置:org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java |
上面的方法,最终会选择一个合适的locality级别,进入接下来的分配过程:
1 | //位置:org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java |
下面继续沿着reserve创建的函数reserve(…)继续跟进。
1 | //位置:org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java |
至此,reserve已经被创建。
4. Reservation的分配
下面再回过头来看一下查看是否有一个合法的Reservation的逻辑。
1 | //位置:org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java |
assignContainer(node, true);这个函数在上面已经进入过,只是当时第二个参数是false,代表没有已经reserve的container,现在的第二个参数是true,代表有已经reserve的container。可以沿着上面的分析逻辑再走一遍,正好加深一下记忆 ;)