算子实例的事件时间是否有可能变小?



从以下 URL 中的"并行流中的水印"部分,我们知道"运算符的当前事件时间是其输入流事件时间的最小值" https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/event_time.html

现在我们以 window(1( 实例的事件时间为例,我们知道事件时间为 14(min(29,14((,但是如果发生以下序列水印事件会发生什么?

如果水印事件29 在水印事件 14 之前到达窗口 (1(,会发生什么情况?

比如假设水印事件29首先到达window(1(实例,因为水印14事件还没有到达,所以windows(1(实例的事件时间首先设置为29,之后假设水印事件14也到达window(1(实例,那么window(1(实例的事件时间设置为14?(如果是这样的话,那么窗口(1(的事件时间会从29变为14,变小(,还假设之后源(2(生成了一个水印39,然后到达窗口(1(实例,那么窗口(1(实例的事件时间会设置为29或39?

最后我也从源头得到了答案,就像大卫说的那样"窗口的水印将保持在Long.MIN_VALUE,直到两个输入流都有更大的值。

https://github.com/apache/flink/blob/57b950796deebed46ae95f97152e09b2e2655de8/flink-streaming-java/src/main/java/org/apache/flink/streaming/api/operators/AbstractStreamOperator.java

public void processWatermark1(Watermark mark) throws Exception {
input1Watermark = mark.getTimestamp();
long newMin = Math.min(input1Watermark, input2Watermark);
if (newMin > combinedWatermark) {
combinedWatermark = newMin;
processWatermark(new Watermark(combinedWatermark));
}
}
public void processWatermark2(Watermark mark) throws Exception {
input2Watermark = mark.getTimestamp();
long newMin = Math.min(input1Watermark, input2Watermark);
if (newMin > combinedWatermark) {
combinedWatermark = newMin;
processWatermark(new Watermark(combinedWatermark));
}
}
Such as suppose the watermark event 29 arrives at the window(1) instance 
firstly, as the watermark 14 event hasn't arrived it, so the event time of 
window(1) instance was set to 29 firstly ...

这是不正确的。占位符值 Long.MIN_VALUE 一直使用,直到第一个正确的水印到达。因此,窗口的水印将保持在 Long.MIN_VALUE,直到两个输入流都到达更大的值。

简短的回答是不,在这种情况下窗口不会变小(实际上可能会引发异常(。

这就是BoundedOutOfOrderness水印提取器发挥作用的地方。使用它,您可以配置时间戳的"无序"程度,它将消除这些差异。默认情况下,使用升序时间戳提取器,接收无序的时间戳实际上是一个错误。

此外,还有"允许延迟"的概念,它定义了在您收到低于当前水印的时间戳的情况下会发生什么。

例如,如果您知道数据源可能有 60 秒的抖动(由于处理时间延迟、地理距离等(,则可以使用值为(TimeUnit.SECONDS, 60)的有界无序提取器,这将有效地将整个窗口向后移动 60 秒。这将允许元素在 60 秒内以任何顺序出现。

但是,如果您实际上希望元素完全按顺序或抖动非常小,但您希望接受延迟元素进行处理,则可以使用"允许延迟"设置来定义当这些元素进入时进程的行为方式。默认情况下,Flink 只会删除它们,但您可以配置一个时间段,在此期间 Flink 将为每个传入的元素重新触发您的窗口。

从根本上说,所有这些都取决于您的具体情况,以及您期望数据进入的紧张和延迟程度,以及您如何处理后期元素。Flink 几乎允许在这里进行任何设置组合。

相关内容

  • 没有找到相关文章

最新更新