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

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

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

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

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

#1楼 票数:1 已采纳

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

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

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

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

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

  ask by Tom translate from so

未解决问题?本站智能推荐:

1回复

处理键控窗口后如何立即清除状态?

我的应用程序使用由时间戳记功能键控的键控窗口。 这意味着一旦触发并处理了特定的窗口,就没有任何必要使该键保持活动状态,因为不可能再次出现该特定的键。 因为此用例涉及不断扩展密钥,所以我想在密钥完成处理后立即清除它的状态,而无需配置计时器。 这是不是可以在实现evictor方法或appl
1回复

Flink是否处理每个键只有一个线程的键控窗口?

Flink 窗口文档说: 拥有键控流将使您的窗口化计算可以由多个任务并行执行,因为每个逻辑键控流都可以独立于其余逻辑流进行处理。 此语句是否意味着每个窗口都由专用线程评估? 如果我有5000万个唯一键创建5000万个窗口,那么将有5000万线程并行执行吗?
1回复

Flink 键控窗口水印

我正在将 flink 与事件时间键控窗口一起使用。 似乎有些窗口没有被发射。 是否单独为每个键添加水印? 例如,如果我的密钥是 (id,type),并且特定的一对 id 和 type 没有被摄取到源中,那么它们的特定窗口水印不会前进吗? 如果是这种情况,我如何确保我的所有键控窗口在一段时间后都会被驱
2回复

Flink 和非键控窗口状态

我正在创建一个 Flink 应用程序,它只是将窗口传入的 Kafka 事件转发到另一个 Kafka 主题,并为每个窗口添加开始和结束标记 - 例如,对于包含1, 2, 3, 4, 5的 1 小时窗口, 我会将start_timestamp, 1, 2, 3, 4, 5, end_timestamp沉
2回复

在没有窗口的键控流上减少Flink

我阅读了源代码,将每个结果都减少到下游。 我想通过没有窗口的键减少流, 如果在窗口上缩小,则flink将在水印到达时将元素前移到下游,因此flink如何确定无窗口的缩小完成。
1回复

在处理函数之后,键控流是否变得没有键控?

假设我在一个键控过程之后得到一个流。 结果流是否仍然键控? 我可以在该流中使用某些 Keyed 状态吗?
1回复

使用Flink在键控窗口中获取计数

我正在通过Scala界面使用Flink进行一些数据处理。 我有一些元组中的用户数据: 我想由用户键入密码,创建一个窗口,然后计算用户在该窗口中观看特定电影的次数,以便最终得到每个电影到每个用户的观看次数的映射。 例如,对于user1 ,正确的输出是Map("titanic" ->
1回复

flink-在键控窗口上折叠

我想每隔15秒处理一次折叠数据。 从“外部”看来,窗口似乎在保留该持续时间内的所有数据,然后立即将其全部提交给fold函数。 真相? 如果是这样,是否有一种方法可以在每次提交新数据时都调用fold函数,然后仅在窗口末尾返回结果 ? 是否可以将其他转换组合在一起以实现此效果?