源码分析基于flink1.14

Join是flink中最常用的操作之一,但是如果滥用的话会有很多的性能问题,了解一下Flink源码的实现原理是非常有必要的

本文的join主要是指flink sql的Regular join 也就是平时我们的双流join中普通的full join ,left join,right join

先找到calcite的relNode转换rule

会将逻辑节点logiceJoin转换成flink的FlinkLogicalJoin

接着看下哪里Rule会转换这个FlinkLogicalJoin

这里会将这种普通join也就是regularJoin给匹配上

条件是

不是这三种join,并且

也不能join表达式包含时间属性

匹配上次rule以后,接着

返回了StreamPhysicalJoin这个StreamPhysicalRel是个物理节点

他的translateToExecNode方法会返回StreamExecJoin,这个类就是我们具体的逻辑了

来看一下

首先会根据会join的类型,确定两个流那个需要输出,如果是fulljoin两个流都会输出,left join就是左流需要outer,right join就是right流需要outer

之后创建了具体的Operator,来看下这个StreamingJoinOperator

先看一下这个类里面两个比较重要的状态

可以看到,左右流都会保存一个状态

看下状态包装类的描述

总共就三,方法,分别是加入数据,撤回数据,获取这个数据关联上的所有数据

在open方法里面会根据上面计算的左右流是否需要输出来初始化这个两个状态

这里状态包装类的创建,将根据数据类型分为三种

1. 流带主键,且join条件包含了主键

这样数据唯一,就只用ValueState来存

2. 流带主键,但join条件没有包含主键

这里就用MapState来存了,每次根据主键更新

3. 流不带主键

就用map,直接把record当key存了

接着看processElement方法

这里详细的代码就不列出来了太复杂了,想看的直接看这个类

org.apache.flink.table.runtime.operators.join.stream.StreamingJoinOperator.processElement()

梳理逻辑我们还是来看下伪代码

主要分为两段

1. 如果是 +Insert / +Update 类型的数据

判断输入数据的流需不需要输出

如果需要输出

看下和另外一个流关联的上不

关联的上输出  +I[record+other]s

关联不上输出  +I[record+null]

将数据加入状态中

如果不需要输出

将数据加入状态中

如果与另外一个流的数据关联上了

如果另外一个流要outer,   输出  +I[record+other]s

如果另外一个流不用输出 ,输出   +I/+U[record+other]s

1. 如果是 -Delete / -Update 类型的数据

状态里面先撤回这条数据

如果与另外流没有匹配上,如果输入数据的流需要输出,则输出  -D[record+null]

如果与另外一条流匹配上了

当前流outer,发送 -D[record+other]s,如果是inner join发送-D/-U[record+other]s

最后的最后

用两个流join的key作为状态的selecter来完成transform的构建就完成了

总结一下:

Flink会根据join的key作为状态分流的selecter,根据表是否有主键,join条件是否包含主键,来创建对应的state数据结构,来优化状态的读写

两条流会根据join类型,来设置此流需不需要输出outer

当数据进入,查询另一侧的流是否有数据可以关联上,以及两条流的outer类型,来确定向下游发送的撤回和新增的数据

												

Flink sql 之 join 与 StreamPhysicalJoinRule (源码解析)的更多相关文章

  1. Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析)

    基于flink1.14的源码做解析 公司内有很多业务方都在使用我们Flink sql平台做TopN的计算,今天同事突然问到我,Flink sql 是怎么实现topN的 ? 蒙圈了,这块源码没看过啊 , ...

  2. [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by

    [源码解析] GroupReduce,GroupCombine和Flink SQL group by 目录 [源码解析] GroupReduce,GroupCombine和Flink SQL grou ...

  3. Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?

    前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的.最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark.Apach ...

  4. [源码解析] 当 Java Stream 遇见 Flink

    [源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...

  5. Flink 源码解析 —— 源码编译运行

    更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...

  6. Flink 源码解析 —— 如何获取 ExecutionGraph ?

    https://t.zsxq.com/UnA2jIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭建 Flink 1.6. ...

  7. Flink 源码解析 —— 如何获取 JobGraph?

    JobGraph https://t.zsxq.com/naaMf6y 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭建 F ...

  8. Flink 源码解析 —— Flink JobManager 有什么作用?

    JobManager 的作用 https://t.zsxq.com/2VRrbuf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  9. Flink 源码解析 —— JobManager 处理 SubmitJob 的过程

    JobManager 处理 SubmitJob https://t.zsxq.com/3JQJMzZ 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1 ...

随机推荐

  1. java基础之ThreadLocal

    早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序.Thr ...

  2. epoll经典代码示例

    1. epoll原理 原理性的知识不再另做说明,我在这里附上收藏整理的两篇经典文章: select与epoll的本质关系. select.poll.epoll之间的区别. 2. epoll服务器端经典 ...

  3. netfilter框架之hook点

    1. Netfilter中hook的所在位置 当网络上有数据包到来时,由驱动程序将数据包从网卡内存区通过DMA转移到设备主存区(内存区), 之后触发中断通知CPU进行异步响应,之后ip_rcv函数会被 ...

  4. RDS导入注意事项

    1)导入文件大小不超过100M,支持格式有CSV.SQL.ZIP 2)sql文件需注释如下内容: SET @@SESSION.SQL_LOG_BIN=0 ; SET @@GLOBAL.GTID_PUR ...

  5. Linux 配置Maven(避免踩坑篇)

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一.访问Maven官网下载压缩文件. 二.下载好的maven安装包放在磁盘的 /usr/local/ 目录下,如下图: 三.解压该压缩文 ...

  6. 口护万亿市场杀出的实力派 Oclean欧可林

    撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 在"青年必去的电影节"上,发现了一个跟他们打成一片的智能护齿"新星". 25日,备受关注的第15届FIRST青年电 ...

  7. 恶意软件开发——突破SESSION 0 隔离的远线程注入

    一.前言 在Windows XP,Windows Server 2003以及更早的版本中,第一个登录的用户以及Windows的所有服务都运行在Session 0上,这样的做法导致用户使用的应用程序可能 ...

  8. 自己用树莓派做了一个电视盒子,还可以看优酷和cctv

    我刚接触树莓派时间不久,安装过raspberry(树莓派官方系统),ubuntu mate,openelec等系统,openelec是一个电视盒子系统,但是我的用的电视机是一个老式的,老是出现闪屏的问 ...

  9. VBox 虚拟机安装 Openwrt 做旁路由

    VBox 虚拟机安装 Openwrt 做旁路由 需求:开个虚拟机做旁路由,电脑把网关设置成旁路由地址,用它跑个上网或其他什么东西. 安装及配置过程简述 这件事流程很简单,总结起来主要有以下几点: 安装 ...

  10. 如何创建 Office LTSC 2021 VL(批量许可)版本的安装 ISO

    Office LTSC 2021 发布 2021 年 9 月 16 日,微软正式发布了支持 Office 2021 的部署工具(Office Deployment Tool),这意味着 Office ...