Flink 调度源码分析1:拓扑图创建与提交过程

3. 集群接收并处理 JobGraph

这部分实现在 flink-runtime 模块中的 org.apache.flink.runtime.rest.handler.job.JobSubmitHandler.handleRequest() 方法中。在该方法中,会获取 restClient 的文件,获取 JobGraph 和对应的依赖、jar包,然后通过 dispatchergateway 提交 JobGraph。
下面代码负责继续处理 JobGraph。

CompletableFuture<Acknowledge> jobSubmissionFuture =  
        finalizedJobGraphFuture.thenCompose(  
                jobGraph -> gateway.submitJob(jobGraph, timeout));

可进而查看其调用的方法,如下所示。

gateway.submitJob(jobGraph, timeout)
-> internalSubmitJob(jobGraph)
	-> this::persistAndRunJob
		-> runJob(createJobMasterRunner(jobGraph), ExecutionType.SUBMISSION)

在 runJob() 中会创建 JobMaster,然后 JobGraph 在 JobMaster 中会被转化成 ExecutionGraph。

4. 生成 ExecutionGraph

Client 会将 JobGraph 进行提交,然后服务端会接收 JobGraph,创建 JobMaster,并将 JobGraph 转换为 ExecutionGraph。

  • 集群会在创建调度器时,创建 ExecutionGraph。调度器会继承 SchedulerBase 类,在该类的构造函数中通过下面的代码创建 ExecutionGraph。
this.executionGraph =  
        createAndRestoreExecutionGraph(  
                completedCheckpointStore,  
                checkpointsCleaner,  
                checkpointIdCounter,  
                initializationTimestamp,  
                mainThreadExecutor,  
                jobStatusListener,  
                vertexParallelismStore);

查看其调用过程如下。

createAndRestoreExecutionGraph(...)
-> final ExecutionGraph newExecutionGraph =  
    executionGraphFactory.createAndRestoreExecutionGraph(...)
    -> final ExecutionGraph newExecutionGraph =  
    DefaultExecutionGraphBuilder.buildGraph(...)

  • JobManager 会根据 JobGraph 生成对应的 ExecutionGraph。ExecutionGraph 需要根据并行度将每个算子创建 ExecutionGraph,每个 ExecutionGraph 对应一个实例。该功能主要实现在 flink-runtime 模块中的 org.apache.flink.runtime.executiongraph.DefaultExecutionGraphBuilder.buildGraph() 方法中。该方法的部分代码如下:
// 创建一个执行图 
final DefaultExecutionGraph executionGraph =  
        new DefaultExecutionGraph(......);  
// 设置执行图的作业名、节点等信息 
try {  
    executionGraph.setJsonPlan(JsonPlanGenerator.generatePlan(jobGraph));  
} catch (Throwable t) {  
    ......
}  
......
// 创建节点
for (JobVertex vertex : jobGraph.getVertices()) {  
    try {  
        vertex.initializeOnMaster(  
                new SimpleInitializeOnMasterContext(  
                        classLoader,  
                        vertexParallelismStore  
                                .getParallelismInfo(vertex.getID())  
                                .getParallelism()));  
    } catch (Throwable t) {......}  
}  
// topologically sort the job vertices and attach the graph to the existing one 
List<JobVertex> sortedTopology = jobGraph.getVerticesSortedTopologicallyFromSources();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值