我已经定义了一个Flink应用程序,该应用程序可以从2个输入流中读取,合并并合并合并后的流的事件:
// Define first input stream and assign timestamp and watermark for that stream
DataStream<InputEvent> pendingTasks = env.fromCollection(..);
pendingTasks = pendingTasks.assignTimestampAndWatermarks(new EventTimeAndWatermarks());
// Define second input stream
DataStream<InputEvent> completedTasks = env.fromCollection(..);
completedTasks = completedTasks.assignTimestampAndWatermarks(new EventTimeAndWatermarks());
// Define the aggregation logic
DataStream<OutputEvent> stream = pendingTasks.union(completedTasks)
.keyBy(new TaskOwnerSelector())
.process(new ProcessingFunctionAudit())
我的ProcessingFunctionAudit实现使用环形缓冲区存储事件。例如,环形缓冲区可以存储事件时间为(x,x + 2小时]的事件,这意味着来自两个流的事件在环形缓冲区覆盖的时间段内应具有事件时间,否则我无法存储它们,或者我需要前移环形缓冲区。
问题在于Flink似乎并没有限制来自第一个输入流的事件和来自第二个输入流的事件之间的事件时间差。我的函数可能会从第一个流中接收到比从第二个流中接收到的最后一个事件更远的事件(在事件时间中),这会强制实现前滚环形缓冲区(以便存储事件),但是当第二个流中的事件传递到我的函数时,缓冲区在将来太遥远了。
我正在寻找一种机制来限制来自每个流的事件之间的事件时间差。如果一个流在一段时间内不产生事件,则理想情况下,如果Flink在另一个流中传递的最后一个事件的发生时间超过X分钟之后,则不应该从另一个流中传递事件。 无论如何,传递这些事件是没有用的,因为只要其他流没有赶上,操作员的水印就不会向前移动,而向前移动水印会触发对我的实现状态的评估。