我正在尝试使用自定义代码评估我们目前正在生产中使用的用例Apache Flink。
所以,让我们说有一个事件流,每个事件包含一个特定属性 X ,这是一个连续增加的整数。这是一堆连续事件,将此属性设置为N,然后下一批将其设置为N + 1等。 我想将流分解为具有相同 X 值的事件窗口,然后分别对每个事件进行一些计算。
所以我定义了一个GlobalWindow和一个自定义Trigger,其中在 onElement 方法中我检查任何给定元素的属性与当前X的保存值(来自状态变量),如果它们不同,我得出结论我们已经用X = CURRENT积累了所有事件,并且有时间进行计算并增加状态中的X值。
这种方法的问题是来自下一个逻辑批次(X = CURRENT + 1)的元素已经被消耗,但它不是前一批次的一部分。 有没有办法将它以某种方式放回到流中,以便正确地考虑下一批?
或许我的方法完全错了,有更简单的方法来实现我的需求?
谢谢。
答案 0 :(得分:1)
我认为你走在正确的轨道上。
Trigger
指定何时可以处理窗口并且可以发出窗口的结果。
WindowAssigner
是说明将分配哪个窗口元素的部分。所以我要说你还需要提供WindowAssigner
的自定义实现,它将为具有相等X值的所有元素分配相同的窗口。
答案 1 :(得分:1)
使用Flink执行此操作的更惯用方法是使用stream.keyBy(X).window(...)
。 keyBy(X)
负责按X的特定值对元素进行分组。然后应用您喜欢的任何类型的窗口。在你的情况下,SessionWindow可能是一个不错的选择。在某个可配置的时间段内没有看到该密钥后,它将为每个密钥触发。
对于您必须始终在流处理系统中假设的无序数据,此方法将更加健壮。