有没有办法定义一个flink count窗口,如果未达到计数,它会在给定时间后逐出所有消息?

toe95027  于 2021-06-25  发布在  Flink
关注(0)|答案(2)|浏览(236)

我目前正在做一个流程序,它聚合了大量消息的数据(8),聚合需要全部8条消息,所以我使用了一个计数窗口。所有8条消息共享相同的唯一密钥。但是,不能保证所有8条消息都会到达。所以我的问题有两个:
首先,Flink计数窗口从不关闭会发生什么?我假设windows只是在超时累积,消耗越来越多的ram。
其次,如果计数窗口在给定的时间内没有接收到所有的消息,我可以关闭它吗?我正在寻找一个解决方案,是尽可能实时,我已经尝试使用一个时间窗口,但时间飞行的消息在几毫秒和40秒之间变化。
那么本质上有没有一种方法可以定义一个在8条消息时触发的窗口,并在给定的时间后(在本例中是在60秒后)从窗口中逐出所有消息?

3z6pesqy

3z6pesqy1#

对于这种需要将有状态流处理与计时器结合起来的情况, ProcessFunction 是个不错的选择。看到了吗https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/stream/process_function.html.

wljmcqd8

wljmcqd82#

关于从不关闭窗口的问题的答案是,为它们保留的状态部分将永远不会被释放。
您所描述的行为可以通过全局窗口上的自定义触发器和逐出器来实现。触发器可以在发出窗口之前等待预期的时间或元素数,而如果少于8个,则逐出器将逐出所有消息。对于一些参考实现,您可以看看 CountTrigger (计数时发射)和 EventTimeTrigger (准时发射)。为驱逐者看一看 CountEvictor .

相关问题