深入解析yarn架构设计与技术实现-Resource Manager剖析2

Application管理

在yarn中,application指的是应用程序,他可能由多个实例组成。他有权限管理、运行状态几部分组成。权限管理主要由ApplicationACLsManager负责,应用程序的启动和关闭由RMAppManager负责,而运行状态主要由状态机负责。权限那里就略掉不写了,主要说一下状态机。

状态机管理

在ResourceManager内部主要有四类状态机:

  • RMApp:和RMAppAttempt共同维护一个Application的生命周期。Application的声明周期由RMApp维护
  • RMAppAttempt:一个Application可能尝试多次运行,每次尝试由RMAppAttempt维护。RMAppAttempt的生命周期与Application基本一致。因为如果一个ApplicationMaster失败了,yarn可能会另外启动一个ApplicationMaster,这就是这个Application的另一次尝试了
  • RMContainer:ApplicationMaster启动后,会不断向RM申请Container来运行任务,Container的生命周期由RMContainer维护。
  • RMNode:维护NodeManager的生命周期

下图是四个状态机转化的图,可以点进去看大图,应该清楚一些,我的版本是2.7.1。这里就不一一列举他们每个状态是怎么转化之类的,状态太多了,大家去看书吧。顺便提一句,yarn提供了生成这个图的方法。

  1. mvn compile -Pvisualize
  2. dot -Tpng ResourceManager.gv > ResourceManager.png

2016-07-25-213100

我们来选一个状态机看看yarn的代码结构,比如RMApp。RmApp是一个接口,同时extends了EventHandler<RMAppEvent>。这意味着它一定会实现一个handle函数。至于RMapp的其他函数getUser啦反而不重要了。

它的实现是在RMAppImpl里面,打开这个类,首先会看到structure里面有一排内部类,当时我就慌了。不过静下心看一下,每个内部类都是extends一个xxTransition并实现了transition函数。回想一下状态机库,状态机工厂就是通过对一个StateMachineFactory不断addTransition并且最后调用installTopology生成的,之后通过make构造出一个状态机。这里的成员变量statMachine正是这样构造的。而addTranstion函数的参数如下:

1
2
3
4
addTransition(STATE preState,
STATE postState,
EVENTTYPE eventType,
SingleArcTransition<OPERAND, EVENT> hook)

其中第四个参数传入的就是我们看到的内部类,也就是说这个状态机在从状态perState接收到eventType转换到postState时会调用一下内部类xxTransition里的transition。这样程序结构就清楚了,至于状态具体如何转换也是看书吧。

最后再看看handle函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void handle(RMAppEvent event) {
this.writeLock.lock();
try {
ApplicationId appID = event.getApplicationId();
LOG.debug("Processing event for " + appID + " of type "
+ event.getType());
final RMAppState oldState = getState();
try {
/* keep the master in sync with the state machine */
this.stateMachine.doTransition(event.getType(), event);
} catch (InvalidStateTransitonException e) {
LOG.error("Can't handle this event at current state", e);
/* TODO fail the application on the failed transition */
}
if (oldState != getState()) {
LOG.info(appID + " State change from " + oldState + " to "
+ getState());
}
} finally {
this.writeLock.unlock();
}
}

主要就是第十行调用stateMachine.doTransition不断完成状态转移。所以状态机的整个流程就是先用内部类实现各种transition。然后用addTranstion,installTopology和make构造出一个stateMachine。之后handle不断调用statMachine.doTransition来进行状态转移。

至于真正的状态变化,建议看一遍书,有个大概印象,之后遇到问题再回去查。因为太复杂了,真心记不住


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2016/07/27/深入解析yarn架构设计与技术实现-Resource-Manager剖析2/