title: Flink系列
四、Flink Runtime 四层 Graph 详解
首先回顾一下 Flink 的整体架构设计:
{% asset_img processes.svg %}
关于上图中的一些概念的解释:
1、DataFlow Graph 是一个逻辑概念,表示这个应用程序的一个执行图,事实上在客户端的时候,会生成两个图:StreamGraph + JobGraph
注意:StreamGraph 中两种非常重要的概念: StreamNode(Operator 算子)顶点 + StreamEdge 边 。在源码的org.apache.flink.streaming.api.graph.StreamGraph 类中。
2、Client 就是一个 Http 方式的 Restful Client ,负责提交 JobGraph 到 JobManager 中。
3、Jobmanager 接收到 JobGraph 之后,会做一件非常重要的事情:启动一个 JobMaster , 这个 JobMaster 就是负责这个 Job 的执行的,JobMaster 的内部,维护了一个 JobGraph ; 在构造 JobMaster 的时候,同时也会帮 JobGraph 构造成 ExecutionGraph
注意:ExecutionGraph = ExecutionVertex 顶点(这个顶点 里面有一个抽象就代表了一个 Task 的一切信息:Execution , 一个 Execution 会启动一个 Task)
4、JobMaster 接下来会向 ResourceManager 申请 Slot 资源,申请到了之后会部署 Task 启动执行。(注意这个 ResourceManager 不是 YARN 里面的,是JobManager 里面的管理资源的组件)
5、当所有的 Task 都部署到 TaskManager 里面之后,并且都启动好了,并且上下游 Task 之间都建立了连接,则最终形成了一个 物理执行图。
Flink 的一个 Job最终归根结底,是去构建一个高效率的能用于分布式并行执行的 DAG 执行图。Flink 中的执行图可以分成四层:StreamGraph ==> JobGraph ==> ExecutionGraph ==> 物理执行图。
StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。
JobGraph:StreamGraph 经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化为,将多个符合条件的节点 chain 在一起作为一个节点,这样可以减少数据在节点之间流动所需要的序列化反序列化传输消耗。
ExecutionGraph:JobManager 根据 JobGraph 生成 ExecutionGraph。ExecutionGraph 是 JobGraph 的并行化版本,是调度层最核心的数据结构。
物理执行图:JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个 TaskManager 上部署 Task 后形成的图,并不是一个具体的数据结构。
Flink 四层图模型:
上面这张图清晰的给出了 Flink 各个图的工作原理和转换过程。其中最后一个物理执行图并非 Flink 的数据结构,而是程序开始执行后,各个 Task 分布在不同的节点 上,所形成的物理上的关系表示:
1、从 JobGraph 的图里可以看到,数据从上一个 operator(JobVertex) 流到下一个 operator(JobVertex) 的过程中,上游作为生产者提供了IntermediateDataSet,而下游作为消费者需要 JobEdge。事实上,JobEdge 是一个通信管道,连接了上游生产的 dataset和下游的 JobVertex 节点。
2、在 JobGraph 转换到 ExecutionGraph 的过程中,主要发生了以下转变:
(1)加入了并行度的概念,成为真正可调度的图结构
(2)生成了与 JobVertex 对应的 ExecutionJobVertex,ExecutionVertex,与 IntermediateDataSet 对应的 IntermediateResult 和 IntermediateResultPartition 等,并行将通过这些类实现
3、ExecutionGraph 已经可以用于调度任务。我们可以看到,Flink 根据该图生成了一一对应的 Task,每个 Task 对应一个ExecutionGraph 的一个 Execution。
Task 用 InputGate、InputChannel 和 ResultPartition 对应了上面图中的 IntermediateResult和 ExecutionEdge。
那么,设计中为什么要设计这么四层执行逻辑呢?它的意义是什么?
1、StreamGraph 是对用户逻辑的映射
2、JobGraph 在 StreamGraph 基础上进行了一些优化,比如把一部分操作串成 chain 以提高效率
3、ExecutionGraph 是为了调度存在的,加入了并行处理的概念
4、物理执行结构:真正执行的是 Task 及其相关结构
总结:Flink 的四层图概念:
1、StreamGraph 就是通过用户编写程序时指定的算子进行逻辑拼接的
简单说:就是进行算子拼接
2、JobGraph 其实就是在 StreamGraph 的基础之上做了一定的优化,然后生成的逻辑执行图
简单说:就是把能 优化拼接在一起,放在一个 Task 中执行的算子的整合和优化 chain 在一起形成 OperatorChain,类似于 Spark Stage 切分
3、ExecutionGraph 再把 JobGraph 进行并行化生成 ExecutionGraph
简单说:其实 ExecutionGraph 就是 JobGraph 的并行化版本
4、物理执行图 其实是 ExecutionGraph 调度运行之后形成的分布,当一个 Flink Stream Job 中的所有的 Task 都被调度执行起来了之后的状态
简单说:就是最终运行状态图
两个重要的转化:
1、StreamGraph 转变成 JobGraph:把上下游两个相邻算子如果能 chain 到一起,则 chain 到一起做优化
2、JobGraph 转变成 ExecutionGraph: chain 到一起的多个 Operator 就会组成一个 OperatorChain,当 OperatorChain 执行的时候,到底要执行多少个Task,则就需要把 DAG 进行并行化变成实实在在的 Task 来调度执行
补充一张图:Flink job 提交流程
声明:
文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。
By luoyepiaoxue2014
B站: https://space.bilibili.com/1523287361 点击打开链接
微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接