Flink源码分析-任务部署

Flink Job有三种部署模式:

  1. LAZY_FROM_SOURCES 仅当Task的上游都产生数据之后,才会真正的部署Task。
  2. LAZY_FROM_SOURCES_WITH_BATCH_SLOT_REQUESTLAZY_FROM_SOURCES逻辑基本一致。不同的是在申请Slot的时候有超时时间限制。
  3. EAGER ExecutionGraph在被调度时会将所有Task一次性到各个TaskManager。

用户在程序从提交到真正执行大概需要以下几个步骤:

  1. 生成StreamGraph
  2. StreamGraph转换成JobGraph
  3. 将JobGraph提交到集群的Dispatcher组件
  4. Dispatcher持久化存储JobGraph,在稍后的部署Task过程中会用到
  5. Dispatcher启动JobManager,将JobGraph转换成ExecutionGraph
  6. JobManager启动时,会触发ExecutionGraph的部署
  7. 不同的部署模式会导致ExecutionGraph申请资源的方式不一样,流处理默认是EAGER
  8. 遍历所有的ExecutionVertex申请相应的Slot
  9. 造Slot都申请完毕之后,开始部署Execution
  10. 构造TaskDeploymentDescriptor,这个描述符包含了部署一个Task需要的所有信息。JobInformation和TaskInformation都会序列化成二进制数据,如果二进制数据过大会通过BlobStore存储。
  11. 获取Slot对应的TaskManagerGateway,通过Rpc调用将Task描述符提交到TaskManager执行
  12. TaskManager在收到Task描述符之后,首先会去加载之前JobInformation和TaskInformation序列化后的数据。如果它们的二进制数据是存储在Blob中,则会通过BlobService加载对应的文件,然后反序列化成对应的class对象。此Task需要执行的代码包含在TaskInformation中。
  13. 生成Task对象并且开启Task的执行线程
  14. Task在启动后,首先会进行初始化的动作,invokable = loadAndInstantiateInvokable(userCodeClassLoader, nameOfInvokableClass, env);实例化相应的Task(StreamTask),这一步会加载用户的代码。

评论