【双流(1)|原理】flink 双流join原理(1)Interval Join:state过大? 回撤现象出现时,sink如何处理,还有如何优化回撤?数据出现shuffle时join是如何处理的?

2023-11-19

先思考几个问题:

  • 双流join的基本原理是什么?
  • 双流join的分类有哪些,具体的实现是什么?
  • 双流join产生的问题?回撤的情况以及优化的可能性?
  • 多流join数据倾斜与性能优化思路?
  • 多流join的可能性?

一. 流的join和表的join的区别在哪里

  • 左右两边数据是否无穷
  • join的结果是否会更新,流join会有回撤的现象
  • 流join语义实现的复杂性:双流join左右两边的流速不一致,所以要保存两边的数据到内存中,以保证join语义。

 

二. 双流Join分类

Join大体分类只有两种:Window Join和Interval Join。

Window Join

又分为:

  • Tumbling Window Join
  • Sliding Window Join
  • Session window Join
     

Windows类型的join都是利用window的机制,先将数据缓存在Window State中,当窗口触发计算时,执行join操作;

 
interval join

利用state存储数据再处理,且state中的数据有失效机制,依靠数据触发数据清理;
所以实际开发注意状态的过期时间,免得关联不到数据。

 

三. interval join 的基本逻辑

看一个例子:
我们知道订单数据(一个订单的概况,没有包含哪些商品明细)和订单明细(哪个商品,这个商品属于哪个订单)数据是一对多(包含)的关系,因为一条订单可能包含多个商品。对于双流(inner)join可以这样考虑:

  • 当数据是订单数据到来时,数据的到来均保留到LState中,无论是否关联到明细数据,均留作后续join使用。
  • 当数据是明细数据到来时,只要关联到订单数据,数据就可以清除了,否则存储到RState等待join。
  • 当同一时段的(左右表)数据都消费且join完时,清空存储状态。

对于flink来说:
不论是INNER JOIN还是OUTER JOIN 都需要对左右两边的流的数据进行保存,JOIN算子会开辟左右两个State进行数据存储,左右两边的数据到来时候,进行如下操作:

  1. LeftEvent到来存储到LState,RightEvent到来的时候存储到RState;
  2. LeftEvent会去RightState进行JOIN,并发出所有JOIN之后的Event到下游;
  3. RightEvent会去LeftState进行JOIN,并发出所有JOIN之后的Event到下游。
    在这里插入图片描述

join的结果是数据的笛卡尔积后输出的结果;ing

 

思考一下:

对于订单的例子,使用flink join之后的相同的订单数据会更新多次,这里涉及到了回撤和幂等操作,那带有相同(join的)id的数据到sink要怎么更新?等会儿讨论。

 

1. inner join的逻辑

inner join的一个例子,如下图:

在这里插入图片描述

  • 左右两个流的流入的数据都会一直存储到state里面;
  • 数据是按照如图标号的顺序流入,看到右边的流先流入了三个事件,但左边没有事件,先存入RState;
  • 当左边4事件流入时,先存储到LState,然后和RState的三个事件join(如图4事件的join result),三行结果流到下游;
  • 当右边5事件流入时,先存储到RState,然后和LState进行join(如图5事件的join result),然后输出到下游;

inner join的语义

只有join上数据才会流出到下游
因为保存了两个流所有的事件到state中,所以不管数据是如何乱序,都能保证和传统数据库一样的join语义

 

2. left outer join 的逻辑与回撤

首先:和inner join 相比 left join 不管右流是否进行了join,左流的数据都需要流入下游节点。

 
看一个场景:
查询产品库存和订单数量,库存变化事件流和订单事件流进行LEFT JOIN,JION条件是产品ID,具体如下图:

  • 其中数字代表数据的流入顺序:看到左流的数据首先到达了计算任务,不管右流是否有数据,直接输出“+P001,10,null”,其中左流的数据一致维护在state中;
  • (左流)事件2接着流入,然后直接输出,(右流)事件3流入,看到LState中有能join上的数据,因为是第一个join(仅有第一条数据会撤回?ing),需要撤回(做一个标记其实是?)左边下发的“+P001,10,null”数据,之后下发join后的数据到下游;
  • 后续到来的4,5,6,8等待后续P001的事件是不会产生撤回记录的。
    在这里插入图片描述

注意:在Apache Flink系统内部事件类型分为正向事件标记为“+”和撤回事件标记为“-”*

 

四. Interval Join问题讨论

1. state内存过大的问题 ing

对于left 和 inner join有一个问题我们可以思考下:
因为保存了所有事件的state,所以当数据量很大时,是否容易出现OOM,还是有什么机制触发内存的清理。

 
 

2. 数据Shuffle怎么保证join实现

分布式流计算所有数据会进行Shuffle,怎么才能保障左右两边流的要JOIN的数据会在相同的节点进行处理呢?
在双流JOIN的场景,我们会利用JOIN中ON的联接key进行partition,确保两个流相同的联接key会在同一个节点处理,这个在flink的源码中有说明。

在这里插入图片描述

 
 

3. 回撤的优化的一些想法

产生回撤信息最根本的一个原因是不断地向下游多次发送更新结果,因此,为了减少更新的频率并降低并发,可以把更新结果累计一部分之后再发送出去。如上图所示:

第一个场景是一个嵌套 AGG 的场景(例如两次 Count操作),在第一层 Group By 尝试将更新结果发送到下游时候会先做一个 Cache,从而减少向下游发送数据频率。当达到了 Cache 的触发条件时,再把更新结果发送到下游。
第二个场景是 Outer Join,前面提到,Outer Join 产生回撤消息是因为左右两边数据的速率不匹配。以 Left Outer Join 为例,可以把左流的数据进行 Cache。左流数据到达时会去右流的状态里面查找,如果能找到可以与之 Join的数据则不作缓存(redis等?);如果找不到相应数据,则对这条 Key 的数据先做缓存,当到达某些触发条件时,再去右流状态中查找一次,如果仍然找不到相应数据,再去向下游发送一条包含 Null 值的 Join 数据,之后右流相应数据到达就会将 Cache 中该 Key 对应的缓存清空,并向下游发送一条回撤消息。

 
 

4. sink节点对于回撤现象的处理

对于 Sink 节点,目前 Flink 中有三种 sink 类型,AppendStreamTableSink、RetractStreamTableSink 和 UpsertStreamTableSink。

  • AppendStreamTableSink:接收的上游数据是一条 Retract 信息的话会直接报错的,因为它只能描述 Append-Only 语义;
  • RetractStreamTableSink:如果上游算子发送一个 Retract 信息过来,它会对消息做 Delete操作,如果上游算子发送的是正常的更新信息,它会对消息做 Insert 操作;
  • UpsertStreamTableSink:可以理解为对于RetractStreamTableSink 做了一些性能的优化。如果 Sink 数据源支持幂等操作,或者支持按照某 key 做 Update 操作,UpsertStreamTableSink 会在 SQL 翻译的时候把上游 Upsert Key 传到 Table Sink 里面,然后基于该 Key 去做 Update 操作。这样输出的多条相同key的数据就可以更新为一条。

 
 
参考:
Apache Flink 漫谈系列(09) - JOIN 算子

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【双流(1)|原理】flink 双流join原理(1)Interval Join:state过大? 回撤现象出现时,sink如何处理,还有如何优化回撤?数据出现shuffle时join是如何处理的? 的相关文章

  • wimax与anroid的困惑

    我要加入wimax组 研究wimax 但是 为什么是anroid平台呢 wimax和android有关系吗 我们是做wimax芯片的呀 难道wimax芯片上跑anroid系统 好像不太可能 经过分析 应该是xx公司要使用我们的wimax芯片

随机推荐

  • PR-RL:Portrait Relighting via Deep Reinforcement Learning

    文章目录 Title PR RL Portrait Relighting via Deep Reinforcement Learning 1 Article 1 1 Abstract and Introduction 1 2 Conclus
  • thttpd源码分析

    由于最近要自己实现一个嵌入式web服务器 所以开始了对嵌入式web服务器的相关学习 为了使自己对服务器了解更加深入 便找到了开源的服务器进行了相关学习 首先学习的是 thttpd thttpd 是一个小型的 HTTP 服务器 官方网址 ht
  • Elasticsearch 7.13.2启动成功,但无法访问?

    今天在linux服务器上配置了es环境 已经成功运行 如下 原因 elasticsearch出于安全策略考虑 默认仅开启了本地访问 需要额外配置远程访问 备注 生产环境请设置密码 且不要直接开放0 0 0 0 解决 在elasticsear
  • 图像的FFT变换

    一 实验设备 计算机 matlab软件 二 实验目的 1 理解并掌握图像的FFT变换的原理 2 学习使用matlab对图像进行FFT变换 三 实验原理 图像fft变换可以将图像空间域变为频率域 进而对频率域图像进行操作 这样会使操作变得简单
  • vue_cli4遇到的问题及解决

    vue cli4遇到的问题及解决 vue cli4遇到的问题及解决 新建项目时报错 vue cli4遇到的问题及解决 新建项目时报错 新建项目代码 vue create project name 报错信息图 解决办法 检查node版本与np
  • 嵌入式系统C语言编程小心使用局部变量

    问题 今天同事在写一个STM32上的程序时 总是遇到内存溢出的错误 结果发现是因为使用了一个局部变量导致的 因为C语言的局部变量被编译器自动放到栈区的空间 全局变量需要手动申请并释放空间 嵌入式系统的栈区本来就很小 而且要放进去的变量是一个
  • 使用CSS在浏览器中绘制虚拟仪表盘(2020-12-30更新)

    效果
  • 【idea】idea无法打开,常规报错的原因和解决方法

    2020 07 29 更新 mac下因破解无法打开的解决方案 删除 Users 你的名字 Library Preferences IntelliJIdea2019 3 idea vmoptions 添加的内容即可 原因一 老版本的idea没
  • b01lers CTF web 复现

    warmup 按照提示依次 base64 加密后访问 可以访问 flag txt 也就是 Li9mbGFnLnR4dA from base64 import b64decode import flask app flask Flask na
  • Spring基础3——AOP,事务管理

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 AOP简介 1 1 AOP概念 作用 方式
  • 【Qt】智能指针

    https zhuanlan zhihu com p 364014571 ivk sa 1024320u 代码中出现一个bug 最终发现是由于在某个特殊情况下出现了使用垂悬指针 造成了程序崩溃 进而学习了解了Qt的智能指针机制 一 悬垂指针
  • 【力扣经典题目】链表的回文结构,赶快收藏起来

    题目描述 对于一个链表 请设计一个时间复杂度为O n 额外空间复杂度为O 1 的算法 判断其是否为回文结构 给定一个链表的头指针A 请返回一个bool值 代表其是否为回文结构 保证链表长度小于等于900 测试样例 1 gt 2 gt 2 g
  • Windows10 2004无线网卡电源管理消失 电源计划只有平衡

    问题 升级到了Windows10 2004 发现每次睡眠后QQ和微信消息都收不到了 去网卡的属性界面却找不到电源管理面板 并且电源计划中也只能创建平衡的电源计划 在网上找了很多解决办法 最多的是关于一个改注册表中的更改注册表HKEY LOC
  • 9 变量进阶

    变量进阶 变量的引用 可变和不可变类型 局部变量和全局变量 1 变量的引用 变量和数据都是保存在内存中的 在 python 中 函数 的参数传递以及返回值都是靠引用传递的 引用的概念 在 python 中 变量和数据是分开存储的 数据保存在
  • 应用层、传输层、网络层、数据链路层

    应用层 包括 应用服务 FTP FileTransfer Protocol 文件传输协议 和DNS Domain NameSystem 域名系统 发送HTTP请求 DNS域名解析系统 提供通过域名 www baidu com 查找IP地址
  • 劳务派遣员工转正制度是什么

    一 劳务派遣员工转正制度是什么 要根据不同的单位来看 因为具体的制度还是要看用工单位的相关规定 比如大部分银行每年都会有一定的转正名额 公务员和事业单位的转正机会则较少 想要成为正式员工还是要参加招聘考试 银行招聘的时候会以劳务派遣的方式招
  • DDK&WDM学习 - HelloWDM,WDM驱动加载,INF文件

    转自 http www itstudy net html 200911 30 20091130234443 htm 第十五章 驱动程序的安装 方便的 自动的和容易的安装一个设备驱动程序对于用户来说是一个重要的步骤 对于提供给用户容易的设备管
  • 解决存储vuex数据,页面刷新后vuex数据被清空了的问题

    1 vuex刷新后数据会被清除 2 可以监听用户是否手动刷新页面 刷新之前先把vuex的数据存储在localStorage里面 页面加载时读取localStorage里的状态信息给vuex赋值 赋值后再清空localStorage 打开ap
  • 一篇文章看懂自动引用计数和循环引用到底是怎么回事

    ARC Swift中的ARC Automatic Reference Counting 自动引用计数 是一种内存管理机制 用于跟踪和管理应用程序中的对象引用计数 确保内存中的对象只在需要的时候存在 当对象的引用计数为0时就会被系统析构掉 A
  • 【双流(1)|原理】flink 双流join原理(1)Interval Join:state过大? 回撤现象出现时,sink如何处理,还有如何优化回撤?数据出现shuffle时join是如何处理的?

    先思考几个问题 双流join的基本原理是什么 双流join的分类有哪些 具体的实现是什么 双流join产生的问题 回撤的情况以及优化的可能性 多流join数据倾斜与性能优化思路 多流join的可能性 文章目录 一 流的join和表的join