我正在尝试评估apacheflink的用例,我们目前正在使用定制代码在生产环境中运行。
假设有一个事件流,每个事件流包含一个特定的属性x,它是一个不断增加的整数。也就是说,一堆连续的事件将此属性设置为n,然后下一批将其设置为n+1等。我想将流分解为具有相同x值的事件窗口,然后分别对每个窗口进行一些计算。
因此,我定义了一个globalwindow和一个自定义触发器,其中在onelement方法中,我根据当前x的保存值(来自状态变量)检查任何给定元素的属性,如果它们不同,我得出结论,我们已经累积了x=current的所有事件,是时候进行计算并增加状态中的x值了。
这种方法的问题是,下一个逻辑批处理(x=current+1)中的元素已经被使用,但它不是上一个批处理的一部分。有没有办法把它放回流中,这样它就可以被正确地计入下一批?
或者也许我的方法是完全错误的,有一个更简单的方法来实现我的需要?
谢谢您。
2条答案
按热度按时间esyap4oy1#
我想你走对了。
Trigger
指定何时可以处理窗口以及何时可以发出窗口的结果。这个
WindowAssigner
表示将分配给哪个窗口元素的部分。所以我想说,您还需要提供WindowAssigner
将相同的窗口分配给所有值为x的元素。epfja78i2#
对于flink来说,一个更惯用的方法是使用
stream.keyBy(X).window(...)
. 这个keyBy(X)
按元素的特定值对x进行分组。然后你可以使用任何你喜欢的窗口。在您的情况下,sessionwindow可能是一个不错的选择。在某个可配置的时间段内没有看到该键后,它将为每个键触发。对于流处理系统中必须始终假设的无序数据,这种方法将更加健壮。