Flink源码解析(十五)——Flink Task部署过程解析

一、Task部署过程解析

在上一篇随笔中着重解析了allocateSlotsFor(...)方法触发TaskManager启动的过程,本篇随笔继续解析waitForAllSlotsAndDeploy(...)方法触发Task部署的过程。

1、在waitForAllSlotsAndDeploy方法中会为每一个Execution分配资源和注册生产分区,紧接着进行Task部署的过程。

(1)、assignAllResourcesAndRegisterProducedPartitions(...)方法为每一个Execution分配资源和注册生产分区。

assignResource(...)负责为Execution分配slot资源。

可知,在tryAssignResource(...)方法里设置assignedResource成员变量的值,代表Execution被分配slot资源,最后在ExecutionVertex中记录最新一次Execution运行实例的资源分配地址信息。

registerProducedPartitions(...)根据Execution的下游消费节点数量,为Execution(Task)设置下游所有消费分区链接信息。

回顾下随笔九,partitions变量存的是一个ExecutionVertex对应的所有的消费分区。通俗来讲,假如一个DataStream1并行度是2,被下游N个节点消费,则DataStream1每个并行度都会有N个IntermediateResultPartition来表示,在Task创建时需设置N个分区链接信息。

设置分区生产链接信息

收集完所有分区生产链接信息后返回。

由此可知ResultPartitionDeploymentDescriptor是对Task输出信息的描述,一个Task有N个下游消费者就有N个IntermediateResultPartition。这部分内容需要结合随笔九对ExecutionGraph的解析过程去理解。

(2)、上述工作准备好后,开始Execution的部署过程,即方法调用链路如下:

DefaultExecutionDeployer.deployAll(...)
DefaultExecutionDeployer.deployOrHandleError(...)
DefaultExecutionDeployer.deployTaskSafe(...)
Execution.deploy()

进入到Execution的deploy()方法中,根据先前的分区生产链接信息先创建一个Task部署描述符,然后获取到TaskExecutor的网关入口信息,通过taskManagerGateway.submitTask(deployment, rpcTimeout)方法以rpc的形式触发Task的初始化部署过程。

createDeploymentDescriptor(...)方法负责创建一个Task部署描述符,创建过程需要序列化Job信息、序列化Task信息、同时也会用到上面讲述的ResultPartitionDeploymentDescriptor信息,还需要Task数据输入网关部署描述信息,输入网关部署描述信息如下:

createInputGateDeploymentDescriptors(...)方法负责创建输入网关部署描述信息。创建过程中会先获取ExecutionVertex的上游中间结果集信息,然后根据本次ExecutionVertex的下标信息获取对应的上游中间结果分区区间,最后创建输入网关部署描述信息并返回。最终返回整个Task部署描述符。

在Task部署信息创建好后通过TaskExecutor的网关入口信息开始提交Task的初始化部署过程,部署过程如下:

根据传过来的Task部署信息,获取Job信息、Task信息、Task部署描述信息、输入网关部署描述信息等创建Task实例。

在Task构造函数内部可知会赋值一系列重要成员变量,包括nameOfInvokableClass、memoryManager、ioManager、taskStateManager、partitionWriters、inputGates等。其中nameOfInvokableClass即为随笔七中标黄的vertexClass信息,partitionWriters、inputGates分别为Task的输出及输入操作等。

Task类继承于Runnable接口,在创建完Task实例后,TaskExecutor.submitTask(...)就会运行Task.run()方法,开始Task的运行过程。

以上即为Flink Task部署过程解析。

posted @ 2024-02-26 21:14  有一个娃  阅读(30)  评论(0编辑  收藏  举报