自定义窗口上的Flink触发器

时间:2017-02-27 19:48:35

标签: apache-flink

我正在尝试使用自定义代码评估我们目前正在生产中使用的用例Apache Flink。

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

所以我定义了一个GlobalWindow和一个自定义Trigger,其中在 onElement 方法中我检查任何给定元素的属性与当前X的保存值(来自状态变量),如果它们不同,我得出结论我们已经用X = CURRENT积累了所有事件,并且有时间进行计算并增加状态中的X值。

这种方法的问题是来自下一个逻辑批次(X = CURRENT + 1)的元素已经被消耗,但它不是前一批次的一部分。 有没有办法将它以某种方式放回到流中,以便正确地考虑下一批?

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

谢谢。

2 个答案:

答案 0 :(得分:1)

我认为你走在正确的轨道上。

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

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

答案 1 :(得分:1)

使用Flink执行此操作的更惯用方法是使用stream.keyBy(X).window(...)keyBy(X)负责按X的特定值对元素进行分组。然后应用您喜欢的任何类型的窗口。在你的情况下,SessionWindow可能是一个不错的选择。在某个可配置的时间段内没有看到该密钥后,它将为每个密钥触发。

对于您必须始终在流处理系统中假设的无序数据,此方法将更加健壮。