Flink双流join避坑指南

写在前面

在开发一个流式应用的时候,我们会经常用到两种JOIN类型,其一是维表JOIN,另外一种就是双流JOIN。关于维表JOIN,一般使用Temporal Table Join,即加上FOR SYSTEM_TIME AS OF PROCTIME(),表示JOIN维表当前时刻所看到的每条数据。维表是一张不断变化的表,在维表JOIN时,需指明该条记录关联维表快照的时刻。对于双流JOIN,一般经常用到的有LEFT JOININNER JOIN,本文将重点介绍这两种JOIN方式。

前置知识

流处理与批处理

图片

图片

流表对偶性

图片

动态表

图片

持续查询

图片

增量计算

图片

Early Emit & Retraction

图片

双流JOIN

双流JOIN与传统数据库表JOIN的区别

  • 数据集合:传统数据库左右两个表的数据集合是有限的,双流JOIN的数据会源源不断的流入

  • 结果更新:传统数据库表JOIN是一次执行产生最终结果后退出,双流JOIN会持续不断的产生新的结果

  • 计算驱动:双流JOIN由于左右两边的流的速度不一样,需要状态存储,双流驱动

数据Shuffle

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

Temporal Table JOIN与双流JOIN的区别

  • 状态管理:Temporal Table JOIN 和 双流 JOIN都可以管理State

  • 计算驱动:Temporal Table JOIN是单边驱动(本质就是Stream JOIN Table with snapshot),Temporal Table是被动的查询(表的更新不会触发结果的更新), 而双流JOIN是双边驱动,两边都是主动的进行JOIN计算

避坑指南

LEFT OUTER JOIN 可以简写 LEFT JOIN,语义上和INNER JOIN的区别是不论右流是否有JOIN的事件,左流的事件都需要流入下游节点,但右流没有可以JION的事件时候,右边的事件补NULL

![image-20220425191652026](/Users/jiamaoxiang/Library/Application Support/typora-user-images/image-20220425191652026.png)

上面提到的一点很重要,就是

LEFT OUTER JOIN语义上和INNER JOIN的区别是不论右流是否有JOIN的事件,左流的事件都需要流入下游节点,但右流没有可以JION的事件时候,右边的事件补NULL

  • 对于左流的事件,当右边没有JOIN的事件时候,将右边事件列补NULL后流向下游;

  • 当右边事件流入发现左边已经有可以JOIN的key的时候,并且是第一个可以JOIN上的右边事件,需要撤回左边下发的NULL记录,并下发JOIN完整的事件到下游。

而对于INNER JOIN:

这里关于INNER JOIN的语义和大家强调两点:

  • INNER JOIN只有符合JOIN条件时候才会有JOIN结果流出到下游,如果关联不上,流入时候没有任何输出,因为左边还没有可以JOIN的事件;

  • INNER JOIN两边的数据不论如何乱序,都能够保证和传统数据库语义一致,因为我们保存了左右两个流的所有事件到state中。

我们知道,Flink的数据一致性有两种:一种是内部的一致性,一种是端到端的一致性。当我们使用双流JOIN时需要注意上面提到的问题:

通过一个具体案例说明,在实际的应用中,需要关联两个流去获取更多的维度信息,比如要识别某一类的订单类型,需要关联履约的表来获取特定的打标tag,这个时候就需要两个流进行JOIN,此时如果使用LEFT JOIN,由于要使用取到的字段进行GROUP BY,即是该字段目标表主键的组成部分,由于LEFT JOIN的语义是匹配不上左表数据补null,那这个时候就会输出很多中间状态的脏数据(即便内部的数据撤回机制会最终输出正确的结果),这种脏数据对应的主键与最终正确的数据对应的主键是不一样的,所以没有办法更新掉脏数据。对于这种场景,我们需要使用JOIN的方式,即匹配不上会等待,不会向下游输出,这个时候肯定会保证最终结果的一致性。

总结

在使用双流JOIN的时候,要看具体的场景,不然会产生很多中间态的脏数据。回归到两种JOIN方式上面,对于LETF JOIN而言,如果左流的事件没能匹配到右边JOIN的事件时候,将右边事件列补NULL后流向下游。对于JOIN而言,INNER JOIN只有符合JOIN条件时候才会有JOIN结果流出到下游,如果关联不上,流入时候没有任何输出,因为左边还没有可以JOIN的事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Flink双流join是指在Flink流处理框架中,将两个流数据进行关联操作的一种方式。在Flink中,支持两种方式的流的Join: Window Join和Interval Join。 Window Join是基于时间窗口的关联操作,包括滚动窗口Join、滑动窗口Join和会话窗口Join。滚动窗口Join是指将两个流中的元素根据固定大小的时间窗口进行关联操作。滑动窗口Join是指将两个流中的元素根据固定大小的时间窗口以固定的滑动间隔进行关联操作。会话窗口Join是指将两个流中的元素根据一段时间内的活动情况进行关联操作。 Interval Join是基于时间区间的关联操作,它允许流中的元素根据时间区间进行关联操作,而不依赖于固定大小的时间窗口。这样可以处理两条流步调不一致的情况,避免等不到join流窗口就自动关闭的问题。 总结起来,Flink双流join提供了通过时间窗口和时间区间的方式将两个流进行关联操作的灵活性和可靠性。根据具体的需求和数据特点,可以选择合适的窗口类型来进行双流join操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Flink双流join](https://blog.csdn.net/weixin_42796403/article/details/114713553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Flink双流JOIN](https://blog.csdn.net/qq_44696532/article/details/124456980)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值