在Flink JobMaster中生成ExecutionGraph和物理执行计划后,Task是如何提交和执行的呢,本篇我们看下这部分的源码
源码分析
Execution.deploy ===>
public void deploy() throws JobException {
...
final TaskDeploymentDescriptor deployment = vertex.createDeploymentDescriptor(//创建任务部署描述
attemptId,
slot,
taskRestore,
attemptNumber);
final TaskManagerGateway taskManagerGateway = slot.getTaskManagerGateway();
final CompletableFuture<Acknowledge> submitResultFuture = taskManagerGateway.submitTask(deployment, rpcTimeout);// ==> RpcTaskManagerGateway提交task
}
Execution对应的就是具体任务一次执行,在createDeploymentDescriptor方法中转换为具体的物理部署描述。将IntermediateResultPartition转化为ResultPartition,ExecutionEdge转为InputChannelDeploymentDescriptor。调用sumbitTask方法实际调用的是RpcTaskManagerGateway的方法。
@Override
public CompletableFuture<Acknowledge> submitTask(TaskDeploymentDescriptor tdd, Time timeout) {
return taskExecutorGateway.submitTask(tdd, jobMasterId, timeout);//==> TaskExecutor.submitTask
}
===>
@Override
public CompletableFuture<Acknowledge> submitTask(
TaskDeploymentDescriptor tdd,
JobMasterId jobMasterId,
Time timeout) {
try {
...
Task task = new Task(//构造Task
jobInformation,
taskInformation,
tdd.getExecutionAttemptId(),
tdd.getAllocationId(),
tdd.getSubtaskIndex(),
tdd.getAttemptNumber(),
tdd.getProducedPartitions(),
tdd.getInputGa