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生成过程分析的更多相关文章

  1. Windows 10 版本 1507 中的新 AppLocker 功能

    要查看 Windows 10 版本信息,使用[运行]> dxdiag  回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...

  2. websocket通讯协议(10版本)简介

    前言: 工作中用到了websocket 协议10版本的,英文的协议请看这里: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotoc ...

  3. 升级 python 2.6.6 系统到 2.7.10 版本

    CentOS 6 系统默认 Python 版本是:2.6.6 平时在使用中遇到很多的库要求是 2.7.x 版本的库,比如使用 ConfigParser 库,在 2.6 版本库就不支持没有 value ...

  4. 20160303 - 升级 Windows 10 版本 1511 后,文件夹默认打开方式为 cmd 的修复

    问题描述:升级 Windows 10 版本 1511 (OS 内部版本 10586.122)后,文件夹的默认打开方式变成了cmd.双击任何一个文件夹,显示相关的提示错误信息如下: [Window Ti ...

  5. 设置Ubuntu 10.10版本的软件源

    设置Ubuntu 10.10版本的软件源 http://blog.csdn.net/xie1xiao1jun/article/details/49911189   网上有很多关于软件源信息的更新,每次 ...

  6. VS2013+Win10+opencv3.0配置(包括opencv2.4.10版本)

    在win下配置opencv3.0.0还是比较简单的,这里简单说一下配置过程:参考链接:http://blog.csdn.net/u010009145/article/details/50756751 ...

  7. swoole1.8.0+版本异步redis安装(本实例为swoole1.8.10版本)详解

    Swoole-1.8.0+版本增加了对异步Redis客户端的支持,基于redis官方提供的hiredis库实现.Swoole提供了__call魔术方法,来映射绝大部分Redis指令(本次安装实例为sw ...

  8. Windows 10 版本信息

    原文 https://technet.microsoft.com/zh-cn/windows/release-info Windows 10 版本信息 Microsoft 已更新其服务模型. 半年频道 ...

  9. 从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 ...

随机推荐

  1. electron-updater实现更新electron应用程序

    electron-updater实现更新electron应用程序 第一步 安装"electron-updater": "^4.3.5", 打开package.j ...

  2. Linux-京西百花山

    百花山有三个收票的入口,分别在门头沟(G109).房山(G108)和河北 108有两个方向上百花山,史家营和四马台.只有史家营方向能开车到山顶. 四马台那边,不住,要坐景区车才行 尽头是1900多米的 ...

  3. 【转】Python 魔法方法大全

    转载自鱼C论坛:http://bbs.fishc.org/thread-48793-1-2.html 据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Pyt ...

  4. Linux 打开core dump功能

    系统打开core dump功能 在终端中输入命令 ulimit -c ,输出的结果为 0,说明默认是关闭 core dump 的,即当程序异常终止时,也不会生成 core dump 文件: 使用命令  ...

  5. Python ( 学习基础篇 第二部 )

    目录 运算符 算数运算符 比较运算符 赋值运算符 位运算符 逻辑运算符 成员运算符 身份运算符 Python 中运算符的优先级 运算符总结基础语法 判断类型 isinstence 代码块 流程控制 w ...

  6. c++ stl库中的set

    简单说来 set(集合)里的元素 不会有相同元素(也就是说 相同的值不存 )并且 存进去会自动排序  类比sort默认排序从小到大 set排序也是 set/multiset会根据待定的排序准则,自动将 ...

  7. Spark如何删除无效rdd checkpoint

    spark可以使用checkpoint来作为检查点,将rdd的数据写入hdfs文件,也可以利用本地缓存子系统. 当我们使用checkpoint将rdd保存到hdfs文件时,如果任务的临时文件长时间不删 ...

  8. IntelliJ IDEA 使用指南:集成GIT客户端

    一.安装GIT客户端 首先需要在本地安装好GIT的客户端. GIT客户端官网下载地址:https://www.git-scm.com/download/ 安装说明 Linux系统安装 使用yum指令 ...

  9. 签到功能,用 MySQL 还是 Redis ?

    现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜. 如移动app ,签到送流量等活动.   用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看看常 ...

  10. MVC框架的代码审计小教程

    介绍 YxtCMF在线学习系统是一个以thinkphp+bootstrap为框架进行开发的网络学习平台系统. 在线学习系统,为现代学习型组织提供了卓有成效的学习与培训方案, 能够通过在线学习和在线评估 ...