天天看点

Flink Runtime 四层 Graph 详解

作者:左左爱123
Flink Runtime 四层 Graph 详解

Flink的一个job,最终归根结底还是构建一个高效率的能用于分布式的DAG执行图。Flink中的执行图可以分成四层:SteamGraph--->JobGraph--->ExecutionGgraph--->物理执行图

1 StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。

2 JobGraph:StreamGraph :经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化为,将多个符合条件的节点 chain 在一起作为一个节 点,这样可以减少数据在节点之间流动所需要的序列化反序列化传输消耗。

3 JobGraph:StreamGraph 经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化为,将多个符合条件的节点 chain 在一起作为一个节 点,这样可以减少数据在节点之间流动所需要的序列化反序列化传输消耗。

4 物理执行图:JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个 TaskManager 上部署 Task 后形成的图,并不是一个具体的数据结构。

Flink四层图模型如下:

Flink Runtime 四层 Graph 详解
Flink Runtime 四层 Graph 详解

上面这张图清晰的给出了 Flink 各个图的工作原理和转换过程。其中最后一个物理执行图并非 Flink 的数据结构,而是程序开始执行后,各个 Task 分布在不同的节点上,所形成的物理上的关系表示:

  • 从 JobGraph 的图里可以看到,数据从上一个 operator(JobVertex) 流到下一个 operator(JobVertex) 的过程中,上游作为生产者提供了IntermediateDataSet,而下游作为消费者需要 JobEdge。事实上,JobEdge 是一个通信管道,连接了上游生产的 dataset和下游的 JobVertex 节点。
  • 在 JobGraph 转换到 ExecutionGraph 的过程中,主要发生了以下转变:加入了并行度的概念,成为真正可调度的图结构 生成了与 JobVertex 对应的 ExecutionJobVertex,ExecutionVertex,与 IntermediateDataSet 对应的 IntermediateResult 和IntermediateResultPartition 等,并行将通过这些类实现
  • ExecutionGraph 已经可以用于调度任务。我们可以看到,Flink 根据该图生成了一一对应的 Task,每个 Task 对应一个ExecutionGraph 的一个 Execution。
  • Task 用 InputGate、InputChannel 和 ResultPartition 对应了上面图中的 IntermediateResult和 ExecutionEdge。

Flink的四层图概念总结:

1、StreamGraph 就是通过用户编写程序时指定的算子进行逻辑拼接的

简单说:就是进行算子拼接

2、JobGraph 其实就是在 StreamGraph 的基础之上做了一定的优化,然后生成的逻辑执行图

简单说:就是把能 优化拼接在一起,放在一个 Task 中执行的算子的整合和优化 chain 在一起形成 OperatorChain,类似于 Spark Stage 切分

3、ExecutionGraph 再把 JobGraph 进行并行化生成 ExecutionGraph

简单说:其实 ExecutionGraph 就是 JobGraph 的并行化版本

4、物理执行图 其实是 ExecutionGraph 调度运行之后形成的分布,当一个 Flink Stream Job 中的所有的 Task 都被调度执行起来了之后的状态

简单说:就是最终运行状态图

继续阅读