flink:local模式下flink执行环境MiniCluster的启动分析与job提交
LocalExecutor执行job时通过构建一个MiniCluster来完成job的执行,MiniCluster的启动可以简洁的归纳为三个步骤
a、设置conf参数
b、构建MiniCluster对象
c、启动并完成个组件的初始化
d、提交job
下面具体来看:
1、LocalExecutor.startMiniCluster方法
MiniCluster是local模式运行的环境,包含flink运行时组件:作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager)和分发器(Dispatcher)以及一些其他组件,在该方法中仅new了一个MiniCluster对象,其组件的初始化在start中完成。
2、MiniCluster.start方法
实例化RpcService
实例化和启动各类组件
3、构建MiniClusterClient并提交job
3.1 构建MiniClusterClient很简单,直接new一个即可,其内部包含了MiniCluster和Configuration对象
3.2 提交job时虽然是MiniClusterClient提交给MiniCluster,但其实还是调用MiniCluster的submitJob方法,向rpc服务提交任务
3.3 MiniCluster的submitJob方法
从代码中不难追踪到,提交任务时,首先从获取调度器DispatcherGateway,创建连接,上传运行依赖的jar资源,这些准备工作全部完成以后,再有调度器提交job
4、PipelineExecutor接口体系
PipelineExecutor接口是用来执行flink数据流任务的,其设计体系如图
该接口只有一个方法execute方法,具体来看实现:
以LocalExecutor为例,其过程可归纳为:
a、StreamGraph转换为JobGraph
b、启动MiniCluster环境
c、构建ClusterClient对象
d、ClusterClient提交JobGraph
e、解析封装提交任务的结果
其实在AbstractSessionClusterExecutor,其过程非常类似也可以归纳为
a、StreamGraph转换为JobGraph
b、获取ClusterClient对象
c、ClusterClient提交JobGraph
d、解析封装提交任务的结果
5、ClusterClient接口体系
与PipelineExecutor体系相对应,ClusterClient也具备两套实现,在RestClusterClient中,submitJob是通过OutputStream向远端调度器传输了JobGraph对象,而MiniClusterClient前面已经说过是直接调用DispatcherGateway.submitJob方法提交任务。
6、DispatcherGateway接口体系
向上的继承接口就不说了,主要看Dispatcher关于submiJob这块的内容
不难看出,到Dispatcher这里,不管是local模式提交的JobGraph还是其他集群模式提交过来的JobGraph在这里就得到了统一。
7、local模式下flink提交job到dispatcher的全流程
8、此时关于接口的一点理解
前段时间有个小兄弟提出一个想法,在service层有没有必要写接口,当然了没有业务需求背景来谈这个就是耍流氓,扯远了,通过上面的源码追踪其实我们不难发现,当某个功能存在多种实现的场景就非常适合用接口去定义。