flinksql知其所以然(⼗三):流join问题解决
1.序篇
本节是 flink sql 流 join 系列的下篇,上篇的链接如下:
废话不多说,咱们先直接上本⽂的⽬录和结论,⼩伙伴可以先看结论快速了解博主期望本⽂能给⼩伙伴们带来什么帮助:
1. 背景及应⽤场景介绍:博主期望你能了解到,flink sql 提供的丰富的 join ⽅式(总结 6 种:regular join,维表 join,快照 join,interval
join,array 拍平,table function)对我们满⾜需求提供了强⼤的后盾, 这 6 种 join 中涉及到流与流的 join 最常⽤的是 regular join 以及 interval join,本节主要介绍 interval join
2. 来⼀个实战案例:博主以上节说到的曝光⽇志流点击⽇志流为案例展开,主要是想告诉⼩伙伴 flink sql left join 数据不会互相等待,存在
retract 问题,会导致写⼊ kafka 的数据量变⼤, 然后转变思路为使⽤ flink sql interval join 的⽅式可以使得数据互相等待⼀段时间进⾏join,这种⽅式不会存在 retract 问题
3. flink sql interval join 的解决⽅案以及原理的介绍:主要介绍 interval join 的在上述实战案例的运⾏结果及分析源码机制,博主期望你能了
解到,interval join 的执⾏机制是会在你设置的 interval 区间之内互相等待⼀段时间,⼀旦时间推进(事件时间由 watermark 推进)到区间之外(即当前这条数据再也不可能被另⼀条流的数据 join 到时),outer join 会输出没有 join 到的数据,inner join 会从 state 中删除这条数据
4. 总结及展望
2.背景及应⽤场景介绍
书接上⽂,上⽂介绍了曝光流在关联点击流时,使⽤ flink sql regular join 存在的 retract 问题。
本⽂介绍怎么使⽤ flink sql interval join 解决这些问题。
3.来⼀个实战案例
flink sql 知其所以然(⼗⼆):流 join 很难嘛(上)
看看上节的实际案例,来看看在具体输⼊值的场景下,输出值应该长啥样。
box sizing
场景:即常见的曝光⽇志流(show_log)通过 log_id 关联点击⽇志流(click_log),将数据的关联结果进⾏下发。
来⼀波输⼊数据:
曝光数据:
log_id timestamp show_params
12021-11-01 00:01:03show_params
22021-11-01 00:03:00show_params2
32021-11-01 00:05:00show_params3
点击数据:
log_id timestamp click_params
12021-11-01 00:01:53click_params
图⽚
<figcaption >flink web ui</figcaption>
那么此时你可能有⼀个问题,结果中的前两条数据 join 到了输出我是理解的,那当 show_log join 不到 click_log 时为啥也输出了?原理是啥?
博主带你们来定位到具体的实现源码。先看⼀下 transformations。
图⽚
<figcaption >transformations</figcaption>
可以看到事件时间下 interval join 的具体 operator 是 org.apache.flink.table.runtime.operators.join.KeyedCoProcessOperatorWithWatermarkDelay。
其核⼼逻辑就集中在 processElement1 和 processElement2 中,在 processElement1 和 processElement2 中使⽤
org.apache.flink.table.runtime.operators.join.interval.RowTimeIntervalJoin 来处理具体 join 逻辑。RowTimeIntervalJoin 重要⽅法如下图所⽰。
图⽚
TimeIntervalJoin
下⾯详细给⼤家解释⼀下。
4.3.TimeIntervalJoin 简版说明
join 时,左流和右流会在 interval 时间之内相互等待,如果等到了则输出数据[+(show_log,click_log)],如果等不到,并且另⼀条流的时间已经推进到当前这条数据在也不可能 join 到另⼀条流的数据时,则直接输出[+(show_log,null)],[+(null,click_log)]。
举个例⼦,w_time BETWEEN w_time - INTERVAL '10' MINUTE AND w_time + INTERVAL '10' MINUTE, 当 click_log 的时间推进到 2021-11-01 11:00:00 时,这时 show_log 来⼀条 2021-11-01 02:00:00 的数据, 那这条 show_log 必然不可能和 click_log 中的数据join 到了,因为 click_log 中 2021-11-01 01:50:00 到 2021-11-01 02:10:00 之间的数据以及过期删除了。则 show_log 直接输出
[+(show_log,null)]
Notes:
如果你设置了 allowLateness,join 不到的数据的输出和 state 的清理会多保留 allowLateness 时间
4.4.TimeIntervalJoin 详细实现说明
以上⾯案例的 show_log(左表) interval join click_log(右表) 为例(不管是 inner interval join,left interval join,right interval join 还是 full interval join,都会按照下⾯的流程执⾏):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论