我正在尝试评估我们使用自定义代码在生产中运行的用例的Apache Flink。
因此,假设每个事件都包含一个特定属性 x ,这是一个不断增加的整数。这是一堆连续事件,将此属性设置为n,然后下一个批次将其设置为n 1等。我想将流分解为具有相同值的事件窗口的 x ,然后在每个事件上分别进行一些计算。
因此,我定义了一个全局风格和一个自定义触发器,其中 onement 方法中我检查了任何给定元素的属性,以相对于当前x的保存值(来自状态变量),如果它们有所不同,则结束了我们已经累积了所有事件的X =电流,现在该进行计算并增加状态的X值了。
这种方法的问题在于,下一个逻辑批次(带有x = Current 1)的元素已经被消耗掉,但不是上一批的一部分。有没有办法以某种方式将其放回流中,以便将其正确解释为下一个批次?
或我的方法是完全错误的,有一种更简单的方法可以实现我的需求?
谢谢。
我认为您在正确的轨道上。
Trigger
指定何时可以处理窗口,并且可以发出窗口的结果。
WindowAssigner
是说要分配哪个窗口元素的部分。因此,我要说您还需要提供WindowAssigner
的自定义实现,该实现将分配给所有等于x的元素的窗口。
用flink做到这一点的一种更惯用的方法是使用 stream.keyBy(X).window(...)
。keyBy(X)
通过其对X的特定值来处理分组元素。然后,您可以应用任何喜欢的窗口。在您的情况下,SessionWindow可能是一个不错的选择。在某个可配置的时间内看不到该密钥之后,它将为每个键发射。
对于您必须在流处理系统中始终假设的无序数据,这种方法将更加健壮。