自定义窗口上的flink触发器

dpiehjr4  于 2021-06-25  发布在  Flink
关注(0)|答案(2)|浏览(326)

我正在尝试评估apacheflink的用例,我们目前正在使用定制代码在生产环境中运行。
假设有一个事件流,每个事件流包含一个特定的属性x,它是一个不断增加的整数。也就是说,一堆连续的事件将此属性设置为n,然后下一批将其设置为n+1等。我想将流分解为具有相同x值的事件窗口,然后分别对每个窗口进行一些计算。
因此,我定义了一个globalwindow和一个自定义触发器,其中在onelement方法中,我根据当前x的保存值(来自状态变量)检查任何给定元素的属性,如果它们不同,我得出结论,我们已经累积了x=current的所有事件,是时候进行计算并增加状态中的x值了。
这种方法的问题是,下一个逻辑批处理(x=current+1)中的元素已经被使用,但它不是上一个批处理的一部分。有没有办法把它放回流中,这样它就可以被正确地计入下一批?
或者也许我的方法是完全错误的,有一个更简单的方法来实现我的需要?
谢谢您。

esyap4oy

esyap4oy1#

我想你走对了。 Trigger 指定何时可以处理窗口以及何时可以发出窗口的结果。
这个 WindowAssigner 表示将分配给哪个窗口元素的部分。所以我想说,您还需要提供 WindowAssigner 将相同的窗口分配给所有值为x的元素。

epfja78i

epfja78i2#

对于flink来说,一个更惯用的方法是使用 stream.keyBy(X).window(...) . 这个 keyBy(X) 按元素的特定值对x进行分组。然后你可以使用任何你喜欢的窗口。在您的情况下,sessionwindow可能是一个不错的选择。在某个可配置的时间段内没有看到该键后,它将为每个键触发。
对于流处理系统中必须始终假设的无序数据,这种方法将更加健壮。

相关问题