⭐简单说两句⭐
✨ 正在努力的小新~💖 超级爱分享,分享各种有趣干货!👩💻 提供:模拟面试 | 简历诊断 | 独家简历模板🌈 感谢关注,关注了你就是我的超级粉丝啦!🔒 以下内容仅对你可见~
作者:不正经小新
🔎GZH:
不正经小新
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
Flink StreamGraph
什么是StreamGraph
StreamGraph
表示流式处理拓扑的类,它包含构建执行任务图所需的所有信息。
说白了就是我们写的代码直接生成的图,表示程序的拓扑结构
StreamGraph类图,可以看到这个类里面包含了执行任务所需的所有信息,比如状态后端,JobType(流or批)、checkpoint配置等等,我们今天从宏观层面看,不深入每个细节,先看大体,再慢慢深入研究~🥹🥹🥹
代码阅读
getStreamGraph方法代码清单
可以看到,这里穿了个默认参数true
,他的作用就是**清除之前注册 transformations**
为什么要清除? 就是防止多次执行execute时,执行相同的操作。
getStreamGraphGenerator方法代码清单
getStreamGraphGenerator就是是生成一个 StreamGraphGenerator 对象,用于创建流处理拓扑图
下面是对这个方法的解释
- 检查 transformations 列表是否为空:若为空,直接给你抛出异常(可演示)
- 同步缓存文件到配置选项:如果有缓存文件,则将这些文件同步到配置选项 PipelineOptions.CACHED_FILES 中。这是因为 cachedFile 字段还没有迁移到配置中。(这算是个小优化吧~)
- 创建并返回 StreamGraphGenerator 对象
generate() 代码清单
下面就来重点研究下transform这个方法
在看之前,我们先瞅瞅这个transformations里面有哪些元素
transform代码清单
接下来进入translate方法一探究竟
translate方法代码清单 先看【SourceTransformation】的流程
根据断点走到了SourceTransformationTranslator类中的translateInternal方法里面
translateInternal方法代码清单
我们看下addSource方法
这个方法逻辑其实不多,核心在addOperator这个方法里面
addOperator代码清单
addOperator里面的第一个逻辑是addNode (StreamNode)
StreamNode包含程序中的运算符和所有属性
addNode方法代码清单
SourceTransformation的整体流程相对还是比较简单
现在来看一下相对复杂和用的比较多的的OneInputTransformation
前面的步骤是一样的,这次进入的是OneInputTransformationTranslator类中的translateInternal方法
OneInputTransformation具有一个Input,指向它前一个transformation
我们进入到translateInternal方法里面,方法里面前面的逻辑和SourceTransformationTranslator的类似
重点在下面这一块
进入addEdge方法->addEdgeInternal方法
第一次进来走的逻辑是
addEdgeInternal方法代码清单
解释
- virtualSideOutputNodes和virtualPartitionNodes都是虚拟节点
- 虚拟节点都是不会出现在StreamGraph流中的,在添加
edge
的时候,如果节点是虚拟节点,就会递归的寻找上游节点,直到找到一个非虚拟节点。 - partitioner
- 如果没有指定,而且上下游的并行度相同,就会使用ForwardPartitioner
- 上下游的并行度不同的话(以前老版本就是直接抛出异常了),partitioner 是 ForwardForConsecutiveHashPartitioner 类型,则将 partitioner 转换为其内部的 hashPartitioner。否则,抛出 UnsupportedOperationException 异常