发布网友 发布时间:2022-12-09 18:39
共1个回答
热心网友 时间:2023-11-02 01:06
Flink对于join的支持有多种支持,可参考 Flink Join类型 , 本文主要讨论Time interval join支持Table API的双流join,同时支持基于EventTime 和 ProcessingTime的的流流join。 Flink在TableApi中将流作为表使用,下文也不再区分流和表。
Flink对于interval join的支持从1.4版本开始,直到Flink1.6,经过几个版本的增强,形成了从开始的Table/Sql Api的支持,到后续DataStream Api的支持,从开始的inner join 到后来的left outer,right outer, full outerjoin的支持,算是完成了FLink对双流关联的支持,不同版本的功能支持如下:
从官方给出的Release Note来看,Flink1.4,Flink1.5中的双流join是指windowed join,但从官方给出的样例以及源码来看,此处的Windowed Join 应当指的就是interval join;鉴于Flink版本近期的变更较大,笔者不再在原有老版本中测试相关功能,下文的介绍基于Flink最新release版本1.8
在流与流的join中,与其他window join相比,window中的关联通常是两个流中对应的window中的消息可以发生关联, 不能跨window,Interval Join则没有window的概念,直接用时间戳作为关联的条件,更具表达力。由于流消息的无限性以及消息乱序的影响,本应关联上的消息可能进入处理系统的时间有较大差异,一条流中的消息,可能需要和另一条流的多条消息关联,因此流流关联时,通常需要类似如下关联条件:
其中lower bound,upperBound可设置为正值,负值,0
Interval join的实现基本逻辑比较简单,主要依靠 TimeBoundedStreamJoin 完成消息的关联,其核心逻辑主要包含消息的缓存,不同关联类型的处理,消息的清理,但实现起来并不简单,下面基于eventTime分别对以上进行分析:
由于Flink对于流关联的处理逻辑是对于两条流的消息分别处理,但两条流的处理方式是完全一致的,一下基于第一条流(左流)进行分析
假定左流中的消息l如 a,b,2019-07-22 00:00:00 ,左流的可容忍乱序时间OutOfOrder时间设置为10s,其中第三个字段为时间戳字段