操作员实例的事件时间是否可能变小?

时间:2018-05-31 14:42:16

标签: apache-flink flink-streaming

从以下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首先到达窗口(1)实例,因为水印14事件尚未到达它,所以窗口(1)实例的事件时间首先设置为29,之后假设水印14事件也到窗口(1)实例,然后窗口(1)实例的事件时间设置为14? (如果是这种情况,则窗口(1)的事件时间将从29变为14,变小),也可以假设源(2)生成水印39,然后到达窗口(1)实例,然后window(1)实例的事件时间将设置为29或39?

3 个答案:

答案 0 :(得分:2)

最后我也得到了消息来源的答案,正如大卫所说的那样“窗口的水印将保持在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));
}
}

答案 1 :(得分:1)

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,直到从两个输入流中获得更大的值。

答案 2 :(得分:0)

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

这是BoundedOutOfOrderness水印提取器发挥作用的地方。使用它可以配置“乱序”时间戳的方式,并且可以消除这些差异。默认情况下,使用AscendingTimestamp提取程序,实际上接收按顺序排列的时间戳会出错。

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

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

但是,如果您实际上希望元素按顺序排列或者抖动非常小,但是您希望接受后期元素进行处理,则可以使用Allowed Lateness设置来定义过程应该如何当这些元素进入时表现出来。默认情况下,Flink会删除它们,但您可以配置Flink为每个元素重新启动窗口的时间段。

从根本上说,所有这一切只取决于你的具体情况以及你期望数据进入的紧张和迟到,以及你如何处理后期元素。 Flink几乎可以在这里设置任何组合。