Flink watermark 是如何准确判断一个事件迟到的?

How does Flink watermark exactly determines an event is late?

我正在阅读https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/event_timestamp_extractors.html#fixed-amount-of-lateness,好像是说如果t_eventime < t_watermark(小于),则事件被确定为延迟。

当事件时间等于水印时怎么样?如果t_eventime = t_waterwark,那么这个活动是不是迟到了?

我之前一直认为如果t_eventime<=t_watermark,那么事件判定为晚

能否请您告诉我进行确定的代码,谢谢。

确实,code to determine if an event is late in that case 似乎正在使用 <= 比较,因此如果事件的时间戳 + 允许的迟到时间早于或等于水印,即事件被认为是迟到的,即如果它的迟到是>= 0:

    protected boolean isElementLate(StreamRecord<IN> element) {
        return (windowAssigner.isEventTime())
                && (element.getTimestamp() + allowedLateness
                        <= internalTimerService.currentWatermark());
    }

现在为了完整起见,请注意 the value of the watermark itself for the strategy you are referring to 是根据所见过的最新时间戳计算的,减去“乱序”,减去 1。

    public void onPeriodicEmit(WatermarkOutput output) {
        output.emitWatermark(new Watermark(maxTimestamp - outOfOrdernessMillis - 1));
    }

这意味着上面第一个代码段中用于比较的实际延迟比直觉告诉我们的要多 1 毫秒,s.t。 lateness > 0 实际上可能是我们人类为了理解正在发生的事情而需要阅读的内容。

现在这些参数的意思是估计我们认为我们的数据在现实世界中可能有多乱,可能是由于网络竞争条件或未对齐的时钟等等,并且在进行估算时,我们通常不如 1 ms 精确。所以这一切都不应该那么重要:希望这种情况在我们的数据中很少见,尽管由于数据本身的原因,有多少通常有点随机。