繁体   English   中英

如何知道键控窗口处理将开始并已完成

[英]How to know that the keyed window processing will start and has been finished

我有一个键控窗口流处理应用程序( KeyStream.window.process ),该窗口是一个 15 分钟的滚动窗口。

我想知道新窗口处理何时开始以及该窗口处理何时结束,以便我可以利用这个机会在globally进行一些清理/初始化工作。

对于每个窗口,在处理开始之前,我想做一些初始化工作,比如truncate一个db表(这个操作应该只发生在一个地方,这是一个全局操作,不应该在process方法中进行) .

并且当处理窗口结束时(所有流程操作员的任务已经完成),我想做一些其他的清理工作(再次,这是一个全局操作)。

我想知道在flink中是否可以以及如何做,谢谢!

我认为您可以在遵循窗口的运算符中完成此操作,以并行度运行。 该运算符需要检测新一批结果何时开始从窗口到达,并且可以执行关闭数据库中的前一个窗口并在那时初始化新窗口所需的操作。 如果/当作业结束或关闭时,它还可以实现close()来做任何需要的总结。

完成初始化后,此运算符可以简单地转发它从窗口运算符接收到的所有事件,直到检测到下一个窗口结果的开始。

该操作符需要保持一个管理状态,即当前窗口的某种标识符,以便它可以检测新窗口何时开始。 来自窗口的结果将需要携带此标识符——它可能只是窗口的开始或结束时间戳。

你可以使用 Flink 的 key partitioned state 来表示这个状态——你可以简单地通过一个常量来对流进行键控。 这通常是一个坏主意,因为它将有效并行性强制为一个(因为每个事件都将被分配相同的键),但是由于这个(全局)运算符无论如何都需要这样做,所以这不是问题。

鉴于这些要求,此运算符可以是RichFlatMapFunctionKeyedProcessFunction 如果您发现自己想要使用计时器进行清理,则需要使用KeyedProcessFunction

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM