Flink源码分析-任务部署
Flink Job有三种部署模式:
- LAZY_FROM_SOURCES仅当Task的上游都产生数据之后,才会真正的部署Task。
- LAZY_FROM_SOURCES_WITH_BATCH_SLOT_REQUEST与- LAZY_FROM_SOURCES逻辑基本一致。不同的是在申请Slot的时候有超时时间限制。
- EAGERExecutionGraph在被调度时会将所有Task一次性到各个TaskManager。
用户在程序从提交到真正执行大概需要以下几个步骤:
- 生成StreamGraph
- StreamGraph转换成JobGraph
- 将JobGraph提交到集群的Dispatcher组件
- Dispatcher持久化存储JobGraph,在稍后的部署Task过程中会用到
- Dispatcher启动JobManager,将JobGraph转换成ExecutionGraph
- JobManager启动时,会触发ExecutionGraph的部署
- 不同的部署模式会导致ExecutionGraph申请资源的方式不一样,流处理默认是EAGER
- 遍历所有的ExecutionVertex申请相应的Slot
- 造Slot都申请完毕之后,开始部署Execution
- 构造TaskDeploymentDescriptor,这个描述符包含了部署一个Task需要的所有信息。JobInformation和TaskInformation都会序列化成二进制数据,如果二进制数据过大会通过BlobStore存储。
- 获取Slot对应的TaskManagerGateway,通过Rpc调用将Task描述符提交到TaskManager执行
- TaskManager在收到Task描述符之后,首先会去加载之前JobInformation和TaskInformation序列化后的数据。如果它们的二进制数据是存储在Blob中,则会通过BlobService加载对应的文件,然后反序列化成对应的class对象。此Task需要执行的代码包含在TaskInformation中。
- 生成Task对象并且开启Task的执行线程
- Task在启动后,首先会进行初始化的动作,invokable = loadAndInstantiateInvokable(userCodeClassLoader, nameOfInvokableClass, env);实例化相应的Task(StreamTask),这一步会加载用户的代码。