flink1.10版本StreamGraph生成过程分析
1、StreamGraph本质
本质就是按照用程序代码的执行顺序构建出来的用于向执行环境传输的流式图,并且可以支持可视化展示给用户的一种数据结构。
2、StreamGraph、StreamNode和StreamEdge的数据结构
StreamGraph构建DAG流图时,其核心是要维护好节点及节点之间的关系即可,关于这块主要是以下关键属性:
而节点之间的关系是由节点自身数据结构来维护的,在StreamNode包含着节点和上下游节点间的关系:
节点关系的具体表征就是StreamEdge了:
以上三个类除了维护构建DAG流图相关属性外,还包含了其他与流程序执行相关的属性以及一些其他参数,如输入输出序列化、格式化等等。
3、构建入口
从StreamExecutionEnvironment环境中构建StreamGraph时分成两个部分:
首先从全局执行环境参数中构建出一个StreamGraphGenerator对象,并将部分全局参数设置进去;
然后再由这个StreamGraphGenerator对象去generat出StreamGraph
3、构建过程
构建过程又可以分为两个步骤:
首先new一个StreamGraph对象,并且设置其全局的一些config参数:
然后对其中的每一个transform算子进行循环递归处理,组织其内部的Node与Edge关系,形成最终结果:
单个算子的处理时,根据每个算子的类型有其单独的算法
4、Transformation抽象类的体系结构
这里没有定义为接口而是一个抽象类,猜测设计这个类的初衷是提取公共属性而非提取transform的模板方法了,否则也不会有上面那一大坨分类处理的ifelse
5、transform算子具体逻辑
transform算子的套路额基本相差不大,都是由transformXXX方法完成,大概都包含以下步骤:
a、包含input时先递归处理上游算子;
b、通过一个hashmap的缓冲池检验是否已经处理过,避免重复处理
c、选择slot共享算法
d、生成StreamNode并加入StreamGraph
e、设置输入输出序列化方式、格式化类型等规则
f、设置算子并行度
g、生成StreamEdge,维护正确的上下游关系
其中如果有多输入或者虚拟节点时,根据具体规则进行节点的拆分重组,然后再递归调用即可,下面看各类型节点的具体处理规则
OneInputTransformation<IN, OUT>
TwoInputTransformation<IN1, IN2, OUT>
SourceTransformation:source节点没有上游节点了,其边的关系由他的下游节点维护即可
SinkTransformation
UnionTransformation:union时,只需维护好上下游的关系即可,正确连接起来
SplitTransformation:split则拆分出两个OutputSelector
SelectTransformation:select当做虚拟算子处理
FeedbackTransformation:feedback比较特殊,形成新类似的source/sink节点对,需要再次分别处理
CoFeedbackTransformation:对比参考FeedbackTransformation
PartitionTransformation:partition也是作为一类虚拟节点来处理,
SideOutputTransformation:类似partition
6、StreamGraph的addSink、addSource以及addOperator、addEdge方法
在transform各类算子时,其实在构建流图时最核心的方法是调用了addOperator和addEdge方法;
addSink和addSource其实是调用了addOperator,同时存储了对应的编码
而addOperator则是调用了addNode方法来添加Node,顺便再次补充设置输入输出的序列化方法和格式化类型
最后来看addNode方法,此处才是真正生成Node并且加入图的方法
addEdge就比较简单了,直接调用addEdgeInternal方法,在addEdgeInternal方法类进行分类处理,如果是虚拟节点就按照对应规则进行拆分重组然后再递归调用,如果是普通节点就构建关系衔接起来即可
至此,整个由StreamExecutionEnvironment中生成StreamGraph的全过程,尤其是构建流图的核心逻辑解析完了
7、最后补充一个点
在StreamExecutionEnvironment中的transforms集合中其实是没有存储source算子的,是由source算子的下游往前找input时补充回去的,看运行时的代码:
对比即可发现,同时在StreamExecutionEnvironment的addSource方法中是没有添加operator操作的
flink1.10版本StreamGraph生成过程分析的更多相关文章
- Windows 10 版本 1507 中的新 AppLocker 功能
要查看 Windows 10 版本信息,使用[运行]> dxdiag 回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...
- websocket通讯协议(10版本)简介
前言: 工作中用到了websocket 协议10版本的,英文的协议请看这里: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotoc ...
- 升级 python 2.6.6 系统到 2.7.10 版本
CentOS 6 系统默认 Python 版本是:2.6.6 平时在使用中遇到很多的库要求是 2.7.x 版本的库,比如使用 ConfigParser 库,在 2.6 版本库就不支持没有 value ...
- 20160303 - 升级 Windows 10 版本 1511 后,文件夹默认打开方式为 cmd 的修复
问题描述:升级 Windows 10 版本 1511 (OS 内部版本 10586.122)后,文件夹的默认打开方式变成了cmd.双击任何一个文件夹,显示相关的提示错误信息如下: [Window Ti ...
- 设置Ubuntu 10.10版本的软件源
设置Ubuntu 10.10版本的软件源 http://blog.csdn.net/xie1xiao1jun/article/details/49911189 网上有很多关于软件源信息的更新,每次 ...
- VS2013+Win10+opencv3.0配置(包括opencv2.4.10版本)
在win下配置opencv3.0.0还是比较简单的,这里简单说一下配置过程:参考链接:http://blog.csdn.net/u010009145/article/details/50756751 ...
- swoole1.8.0+版本异步redis安装(本实例为swoole1.8.10版本)详解
Swoole-1.8.0+版本增加了对异步Redis客户端的支持,基于redis官方提供的hiredis库实现.Swoole提供了__call魔术方法,来映射绝大部分Redis指令(本次安装实例为sw ...
- Windows 10 版本信息
原文 https://technet.microsoft.com/zh-cn/windows/release-info Windows 10 版本信息 Microsoft 已更新其服务模型. 半年频道 ...
- 从Ubuntu 18.04 LTS升级到Ubuntu 18.10版本的方法
从Ubuntu 18.04 LTS升级到Ubuntu 18.10版本的方法 2018-10-18 21:08:39作者:ywnz稿源:云网牛站 本文提供从Ubuntu 18.04 LTS(Bionic ...
随机推荐
- 【原创】xenomai3.1+linux构建linux实时操作系统-基于X86_64和arm
版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 一.概要 二.环境准备 1.1 安装内核编译工 ...
- 【Luogu】P3005 [USACO10DEC]槽的游戏The Trough Game
一.题目 题目描述 农夫约翰和贝西又在玩游戏.这个游戏需要很多个槽. 农夫约翰在谷仓里藏起来了N(1<=N<=20)个槽,并且他已经把其中的一些装上了食物.贝西以"在这个表里(表 ...
- Vagrant系列(一)----win10搭建Vagrant+VirtualBox环境_
一.Vagrant是什么? vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的 ...
- ImageMagick:用identify检查图片是否完整?(jpg/gif/png图片是否损坏)
一,常用图片格式的结束标志是什么? 1,Jpg格式的文件在16进制中的表示是以 ff d9 两个字节结尾 2, gif格式的文件,结尾是 3b 3, png格式的文件,结尾是 00 00 00 ...
- DateDiff() 方法语法 T-SQL语法
表达式DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear]]) 允许数据类型: timeinterval 表示 ...
- Halcon软件介绍与图像基本知识
1.halcon环境 halcon功能:1.视觉算法(核心)基本 2. 弱语言 3.解释性语言 halcon软件介绍: 1.标题栏 2.菜单栏 3.工具栏 4.工作区 图形窗口(显示图像) 变量窗口( ...
- Helium文档13-WebUI自动化-helium快速切换到selenium状态并调用其方法
前言 前面说过helium是对Selenium 进行了封装,那么我们如何使用selenium的方法呢,通过下面的介绍,我们能够清楚在helium中能够使用selenium的任何方法 入参介绍 def ...
- windows下安装mongodb4.x版本
一个无名前辈的血汗经验,提醒来者 现在mongod出到4.x的版本,而网上的大多数教程是针对3.x的版本的.在4.x的版本中,不要再试图使用自定义安装,我搞了3个多小时都没搞定,如果土豪c盘很大,直接 ...
- C--迷途指针
简介: 在计算机编程领域中,迷途指针,或称悬空指针.野指针,指的是不指向任何合法的对象的指针. 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情 ...
- 平时查询linux服务器与应用版本
###JDK版本###java -version ##Tomcat环境版本###进入到tomcat目录的bin下./version.sh ###服务器###(1)osuname -a 查看releas ...