apache flink加入流

n1bvdmb6  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(298)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

10个月前关门了。
改进这个问题
我想加入Flink的两条小溪。条件如下:
每一个都有一个唯一的id用作连接点。
在两个流中,每个键只出现一次。
流中的密钥最多分离10秒。
没有事件时间,但我可以同时使用处理时间或摄取时间。这个限制很重要,因为不允许我使用仅适用于事件时间的间隔连接。
最简单/有效的方法是什么?

7nbnzgx9

7nbnzgx91#

在线flink培训中有一个练习涉及到这个案例,所以你可以把它作为一个起点。
这里提供的解决方案实现了这种一对一的连接,每个键只出现一次,作为一个 RichCoFlatMap .
在这些情况下,重要的是注意不要泄漏状态——如果对于某些键,某个预期事件从未到达,则此实现会这样做,因为不匹配的事件将永远处于状态。因为您知道事件之间的间隔永远不会超过10秒,所以您可以将其实现为 KeyedCoProcessFunction ,并使用处理时间计时器清除因缺少事件而延迟的任何状态。这个关于过期状态的练习也做了类似的事情。或者您可以依赖状态ttl来清除任何未使用的状态。
flink确实通过其更高级别的API支持多种连接--窗口连接、间隔连接、时态连接等--但是对于这种特定类型的连接,这些都不是很好的匹配,而带有进程函数的低级别实现很容易实现,并且会执行得非常好。
更新:
你可以用count个窗口来实现这个,用两个窗口来实现。但是,如果没有任何事件发生,你会发现到处都是悬着的Windows。这可以通过在超时后关闭窗口的自定义触发器来修复。
或者可以通过指定大于10秒的会话间隔,在会话窗口中实现这一点。但是,会话窗口的processwindowfunction在出现间隙之前不会被调用,因此在等待间隙之后才会产生连接结果。我想你可以用一个自定义触发器来解决这个问题。
请注意,这些基于窗口的解决方案都依赖于首先将两个流合并为一个流。你可以用 union 为此,假设您安排两个流具有相同的类型。

相关问题