Apache flink 自定义窗口上的Flink触发器

Apache flink 自定义窗口上的Flink触发器,apache-flink,Apache Flink,我正在尝试评估ApacheFlink的用例,我们目前正在使用定制代码在生产环境中运行 假设有一个事件流,每个事件都包含一个特定的属性X,它是一个不断增加的整数。也就是说,一组连续事件将此属性设置为N,然后下一批将其设置为N+1等。 我想将流分解为具有相同值X的事件窗口,然后分别对每个窗口进行一些计算 因此,我定义了一个GlobalWindow和一个自定义触发器,在OneElement方法中,我根据当前X的保存值(来自状态变量)检查任何给定元素的属性,如果它们不同,我得出结论,我们已经累积了X=c

我正在尝试评估ApacheFlink的用例,我们目前正在使用定制代码在生产环境中运行

假设有一个事件流,每个事件都包含一个特定的属性X,它是一个不断增加的整数。也就是说,一组连续事件将此属性设置为N,然后下一批将其设置为N+1等。 我想将流分解为具有相同值X的事件窗口,然后分别对每个窗口进行一些计算

因此,我定义了一个GlobalWindow和一个自定义触发器,在OneElement方法中,我根据当前X的保存值(来自状态变量)检查任何给定元素的属性,如果它们不同,我得出结论,我们已经累积了X=current的所有事件,是时候进行计算并增加状态中的X值了

这种方法的问题是,下一个逻辑批处理(X=CURRENT+1)中的元素已经被使用,但它不是上一个批处理的一部分。 有没有办法将其放回流中,以便正确地计入下一批

或者我的方法完全错了,有更简单的方法来实现我的需求


谢谢。

我认为你的思路是对的

Trigger
指定何时可以处理窗口并发出窗口结果


WindowAssigner
是说明将分配给哪个窗口元素的部分。所以我想说,您还需要提供一个自定义的
WindowAssigner实现,它将把同一个窗口分配给所有值为X的元素。

使用Flink实现这一点的更惯用方法是使用
stream.keyBy(X).window(…)
keyBy(X)
负责按元素的特定值对X进行分组。然后应用任何类型的窗口。在您的情况下,会话窗口可能是一个不错的选择。在一段可配置的时间内没有看到该键后,它将为每个键触发


对于流处理系统中必须始终假定的无序数据,这种方法将更加健壮。

谢谢Jamie。我的问题是,不同的X值之间没有明确定义的间隙。这是我知道我得到X=N的所有值的唯一方法,当我看到X=N+1时,间隙可能是几天甚至几周。