Flink源码解析(二)JobManager启动分析

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) {

			/***********************
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值