使用一次性连接密钥flink连接流

btqmn9zl  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(253)

我有一个关于在Flink连接两条溪流的问题。我使用两个不同的数据流,在某个时候我需要将它们连接起来。每个数据流都被标记了一个唯一的id,作为这些流之间的连接点。没有窗口的概念,所以为了连接这两个数据流,我首先做了.connect(second).keyby(0,0)。
当我得到正确的结果时,这似乎是有效的,但我的担心是长期的。我没有在执行连接的操作符(coflatmap)上显式保留任何状态,但是如果一个流(例如第一个流)提供唯一的id,而第二个流没有提供连接id,会发生什么情况(我假设对于那些已经加入的流,操作符会丢弃任何类型的内部状态)?内存/状态占用是不断增长还是存在某种过期机制?
如果是这样的话,我该怎么解决这个问题呢?或者你能建议我另一种方法吗?

eqqqjvef

eqqqjvef1#

有几种方法可以实现这种连接。
使用协处理函数。当密钥的第一条记录到达时,您将其存储在state中,并注册一个在x分钟/小时/天之后触发的计时器。当第二条记录到达时,执行连接并清除状态。如果第二条记录没有到达,则 onTimer() 方法将在计时器启动时调用。此时,您可以清除状态并返回(内部连接语义),也可以转发填充了 null 值(外部连接语义),清除状态,然后返回。计时器起到了安全网的作用,可以在某个时刻消除状态。这取决于您的要求,您希望等待第二个记录到达的时间。
表api或sql提供了一个时间窗口连接(表api,sql),其工作原理与我在1中描述的类似。不同之处在于,窗口连接实现将尝试连接在连接间隔期间到达的所有记录(即,每个输入流中的多个记录),因此将保持更长的状态。但是,一旦时间超过连接间隔,就会清除状态。
flink 1.6.0(将于2018年8月初发布)将包括datastream api的间隔连接,其工作方式类似于表api的窗口连接(类似的逻辑,不同的名称)。它还将比自定义实现保持更长的状态,自定义实现基于每个键在每一侧只出现一次的假设。
我会选择方法1。因为它的内存效率更高,而且还相当容易实现。

相关问题