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

Apache flink 如何知道键控窗口处理将开始并已完成,apache-flink,Apache Flink,我有一个键控窗口流处理应用程序(KeyStream.window.process),该窗口是一个15分钟的滚动窗口 我想知道新的窗口处理何时开始,何时结束,这样我就可以利用这个机会在全局范围内执行一些清理/初始化工作 对于每个窗口,在处理开始之前,我想做一些初始化工作,比如截断一个db表(这个操作应该只发生在一个地方,这是一个全局操作,不应该在process方法中完成) 当处理窗口结束时(所有流程操作员的任务都已完成),我想做一些其他清理工作(同样,这是一个全局操作) 我想知道在弗林克是否可行以

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

我想知道新的窗口处理何时开始,何时结束,这样我就可以利用这个机会在全局范围内执行一些清理/初始化工作

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

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


我想知道在弗林克是否可行以及如何做到这一点,谢谢

我认为您可以在一个遵循窗口的操作符中实现这一点,并以1的并行度运行。该操作员需要检测新的一批结果何时开始从窗口到达,并且可以执行关闭数据库中的前一个窗口并在此时初始化新窗口所需的操作。它还可以实现
close()

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

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

您可以使用Flink的key partitioned state来表示这种状态——您只需通过一个常量为流设置密钥。这通常是一个坏主意,因为它强制将有效的并行性分配给一个(因为每个事件将被分配相同的键),但由于这个(全局)操作符无论如何都需要这样做,这不是问题


根据这些要求,此运算符可以是
RichFlatMapFunction
,也可以是
KeyedProcessFunction
。如果您想使用计时器进行清理,则需要使用
KeyedProcessFunction

我不确定这是否可行。但即便如此,老实说,这似乎是一个非常老套和危险的解决方案。难道没有更好的方法来实现你想要实现的目标吗?如果你有一个键控操作,你所说的全局是什么意思?每个键一次,每个应用程序一次?如果是后者,您如何确定在哪台机器上执行该操作?@ArvidHeise因此我想知道该流程操作员中的所有子任务都已完成,并借此机会执行我的初始化/清理操作。@Dominikowsiński我同意,这是一种不好的做法,但有时人们可能想知道窗口处理的开始和结束。谢谢,@David Anderson,我将评估您的解决方案,谢谢!