Flink源码解析(十二)——Flink On Yarn JobManager启动过程ResourceManager启动解析
一、JobManager启动过程ResourceManager启动解析
在上一篇随笔中介绍了Zookeeper Curator框架Leader选举过程和ClusterEntrypoint 3大核心组件基本功能及WebmonitorEndpoint的启动过程。本篇随笔介绍核心组件ResourceManager的启动过程。
1、ResourceManagerService resourceManagerService = ResourceManagerServiceImpl.create(...),其中类继承信息如下:ResourceManagerServiceImpl <- {ResourceManagerService, LeaderContender},可知ResourceManagerServiceImpl是一个Leader选举候选者。
(1)、resourceManagerService创建完成后会调用start()方法启动Leader选举过程,选举过程和上篇随笔WebmonitorEndpoint的Leader选举过程一样。
现在简述如下:
ResourceManagerServiceImpl.start()
DefaultLeaderElection.startLeaderElection(...)
DefaultLeaderElectionService.register(...)
DefaultLeaderElectionService.createLeaderElectionDriver(...)
ZooKeeperLeaderElectionDriverFactory.create(...){
new ZooKeeperLeaderElectionDriver(curatorFramework, leaderElectionListener);
}
ZooKeeperLeaderElectionDriver.isLeader()
DefaultLeaderElectionService.onGrantLeadership(...)
DefaultLeaderElectionService.onGrantLeadershipInternal(...)
DefaultLeaderElectionService.notifyLeaderContenderOfLeadership(...)
ResourceManagerServiceImpl.grantLeadership(...)
ResourceManagerServiceImpl.startNewLeaderResourceManager(...)
可知Leader选举完会回调到ResourceManagerServiceImpl.startNewLeaderResourceManager(...)方法中
1)、resourceManagerFactory.createResourceManager(...)方法最终会创建一个ActiveResourceManager实例,类继承关系如下:
ActiveResourceManager <- ResourceManager <- {
FencedRpcEndpoint <- RpcEndpoint <- RpcGateway
FencedRpcGateway <- RpcGateway
}
2)、startResourceManagerIfIsLeader(...)方法最后会触发resourceManager.start()方法的调用,此方法里会启动resourcemanager所需要的一系列基础组件,下面会详细讲解。
3)、leaderElection.confirmLeadership(...)方法作用是将Leader信息写入Zookeeper路径中。
(2)、resourceManager.start()方法详解,由ActiveResourceManager的继承关系可知,ResourceManager是RpcEndpoint的子类。RpcEndpoint在调用start()方法时会作用到成员变量rpcServer.start()的方法上,由Flink akka RPC框架可知,rpcServer.start()方法最后会回调到RpcEndpoint的onStart()方法上。
(3)、onStart()方法,由下图可知该方法主要是启动2个心跳服务、1个slotmanager服务。
(4)、由startHeartbeatServices()方法可知主要是启动1个ResourceManager到TaskManager的心跳服务、1个ResourceManager到JobManager的心跳服务。在创建心跳服务实例时主要是新建HeartbeatManagerSenderImpl实例对象,该类继承至Runnable接口,构造函数中会添加到定时调度线程池中发起定时的心跳动作。
(5)、slotManager.start(...)方法执行时,主要是开启2个定时服务。一个是空闲TaskManager的回收、一个是slot请求超时的处理。大家可以自行查看。
二、ResourceManager启动总结
以上可知ResourceManager的启动过程不太复杂,根据akka rpc框架原理,主要是启动了2个心跳服务、2个定时服务以及ResourceManager候选者竞选Leader过程并将自己的信息写入Zookeeper中。下一篇随笔解析Dispatcher的启动过程。