Apache Flink 进阶(一):Runtime 核心机制剖析( 十 )

基于上述 Slot 管理和分配的逻辑 , JobManager 负责维护作业中 Task执行的状态 。 如上文所述 , Client 端会向 JobManager 提交一个 JobGraph , 它代表了作业的逻辑结构 。 JobManager 会根据 JobGraph 按并发展开 , 从而得到 JobManager 中关键的 ExecutionGraph 。 ExecutionGraph 的结构如图 5 所示 , 与 JobGraph 相比 , ExecutionGraph 中对于每个 Task 与中间结果等均创建了对应的对象 , 从而可以维护这些实体的信息与状态 。

图6.Flink 中的 JobGraph 与 ExecutionGraph 。 ExecutionGraph 是 JobGraph 按并发展开所形成的 , 它是 JobMaster 中的核心数据结构 。

在一个 Flink Job 中是包含多个 Task 的 , 因此另一个关键的问题是在 Flink 中按什么顺序来调度 Task 。 如图 7 所示 , 目前 Flink 提供了两种基本的调度逻辑 , 即 Eager 调度与 Lazy From Source 。 Eager 调度如其名子所示 , 它会在作业启动时申请资源将所有的 Task 调度起来 。 这种调度算法主要用来调度可能没有终止的流作业 。 与之对应 , Lazy From Source 则是从 Source 开始 , 按拓扑顺序来进行调度 。 简单来说 , Lazy From Source 会先调度没有上游任务的 Source 任务 , 当这些任务执行完成时 , 它会将输出数据缓存到内存或者写入到磁盘中 。 然后 , 对于后续的任务 , 当它的前驱任务全部执行完成后 , Flink 就会将这些任务调度起来 。 这些任务会从读取上游缓存的输出数据进行自己的计算 。 这一过程继续进行直到所有的任务完成计算 。

推荐阅读