1、Flink主节点JobManager启动分析:
1、JobManager是Flink集群的主节点,它包含三大重要的组件:
- ResourceManager
- Flink的集群资源管理器,只有一个,关于slot的管理和申请等工作,都由他负责
- Dispatcher
- 负责接收用户提交的JobGraph,然后启动一个JobManager,类似于YARN集群中的AppMster角色,类似于Spark Job中的Driver角色。启动的时候还会恢复被中断的任务。
- JobManager
- 负责一个具体的Job的执行,在一个集群中,可以会有多个JobManager同时执行,类似于YARN集群中的AppMaster角色,类似于Spark Job中的Driver角色
- WebMonitorEndpoint
- 里面维护了很多很多的Handler,如果客户端通过flink run的方式来提交一个job到flink集群,最终由WebMonitorEndpoint来接收,并且决定使用哪一个Handler来执行处理。(submitJob--> SubmitJobHandler)
总结:
Flink集群的主节点内部运行着:ResourceManager和Dispatcher,当client提交一个job到集群运行的时候(客户端会把该Job构建成一个JobGragh对象),Dispatcher负责拉起JobManager来负责这个Job内部的Task的执行,执行Task所需要的资源,JobManager向ResourceManager申请。
2、源码分析
由上一篇我们知道,JobManager的启动类为StandaloneSessionClusterEntrypoint。这里,我们主要看其核心代码:
StandaloneSessionClusterEntrypoint.main()
ClusterEntrypoint.runClusterEntrypoint(entrypoint)
clusterEntrypoint.startCluster()
runCluster(configuration, pluginManager)
可以看到启动的核心主要在ClusterEntrypoint类中的runCluster方法:
/*************************************************
* 注释:这个方法主要是做两件事情:
* 1、initializeServices() 初始化相关服务
* 2、dispatcherResourceManagerComponentFactory.create() 启动 Dispatcher 和 ResourceManager 服务。
****/
private void runCluster(Configuration configuration, PluginManager pluginManager) throws Exception {
synchronized(lock) {
/**
* 注释: 初始化服务,如 JobManager 的 Akka RPC 服务,HA 服务,心跳检查服务,metric service
* 这些服务都是 Master 节点要使用到的一些服务
* 1、commonRpcService: 基于 Akka 的 RpcService 实现。RPC 服务启动 Akka 参与者来接收从 RpcGateway 调用 RPC
* 2、初始化一个 ioExecutor
* 3、haServices: 提供对高可用性所需的所有服务的访问注册,分布式计数器和领导人选举
* 4、blobServer: 负责侦听传入的请求生成线程来处理这些请求。它还负责创建要存储的目录结构 blob 或临时缓存它们
* 5、heartbeatServices: 提供心跳所需的所有服务。这包括创建心跳接收器和心跳发送者。
* 6、metricRegistry: 跟踪所有已注册的 Metric,它作为连接 MetricGroup 和 MetricReporter
* 7、archivedExecutionGraphStore: 存储执行图ExecutionGraph的可序列化形式。
*/
initializeServices(configuration, pluginManager);
// TODO:将 jobmanager 地址写入配置
// write host information into configuration
configuration.setString(JobManagerOptions.ADDRESS, commonRpcService.getAddress());
configuration.setInteger(JobManagerOptions.PORT, commonRpcService.getPort());
/*************************************************
* 注释: 初始化一个 DefaultDispatcherResourceManagerComponentFactory 工厂实例
* 内部初始化了三大工厂实例
* 1、DispatcherRunnerFactory = DefaultDispatcherRunnerFactory
* 2、ResourceManagerFactory = StandaloneResourceManagerFactory
* 3、RestEndpointFactory(WenMonitorEndpoint的工厂) = SessionRestEndpointFactory
* 返回值:DefaultDispatcherResourceManagerComponentFactory
* 内部包含了这三个工厂实例,就是三个成员变量
* -
* 再补充一个:dispatcherLeaderProcessFactoryFactory = SessionDispatcherLeaderProcessFactoryFactory
*/
final DispatcherResourceManagerComponentFactory dispatcherResourceManagerComponentFactory =
createDispatcherResourceManagerComponentFactory(configuration);
/*************************************************
* 注释:启动关键组件:Dispatcher 和 ResourceManager。
* 1、Dispatcher: 负责用于接收作业提交,持久化它们,生成要执行的作业管理器任务,并在主任务失败时恢复它们。
* 此外, 它知道关于 Flink 会话集群的状态。负责为这个新提交的作业拉起一个新的 JobManager 服务
* 2、ResourceManager: 负责资源的分配和记帐。在整个 Flink 集群中只有一个 ResourceManager,资源相关的内容都由这个服务负责
* registerJobManager(JobMasterId, ResourceID, String, JobID, Time) 负责注册 jobmaster,
* requestSlot(JobMasterId, SlotRequest, Time) 从资源管理器请求一个槽
* 3、WebMonitorEndpoint: 服务于 web 前端 Rest 调用的 Rest 端点,用于接收客户端发送的执行任务的请求
*/
clusterComponent = dispatcherResourceManagerComponentFactory
.create(configuration, ioExecutor, commonRpcService, haServices,
blobServer, heartbeatServices, metricRegistry,
archivedExecutionGraphStore,
new RpcMetricQueryServiceRetriever(metricRegistry.getMetricQueryServiceRpcService()),
this);
/*************************************************
* 注释:集群关闭时的回调
*/
clusterComponent.getShutDownFuture().whenComplete((ApplicationStatus applicationStatus, Throwable throwable) -> {
if(throwable != null) {
shutDownAsync(ApplicationStatus.UNKNOWN, ExceptionUtils.stringifyException(throwable), false);
} else {
// This is the general shutdown path. If a separate more specific shutdown was
// already triggered, this will do nothing
shutDownAsync(applicationStatus, null, true);
}
});
}
}
2.1、初始化服务:initializeServices(configuration, pluginManager);
在这里做了7件初始化服务的事:
/*************************************************
* 注释: 初始化各种服务组件
*/
protected void initializeServices(Configuration configuration, PluginManager pluginManager) throws Exception {
LOG.info("Initializing cluster services.");
synchronized(lock) {
/***********************

最低0.47元/天 解锁文章
1110





