目录
当我们第一次接触 Flink 时往往会对其中的 watermark 感到困惑。但实际上 watermark 并不复杂。在本文中我们将通过一个简单的例子来说明为什么需要水印以及它们如何工作。
在下文中的例子中,我们有一个带有时间戳的事件流,但是由于某种原因流中的事件并不是按顺序到达的。图中的数字代表事件发生的时间戳(Event-time)。第一个事件在时间4达到,它后面跟着的是发生在更早时间(时间 2)的事件,以此类推:
注意这是一个按照事件时间(Event-time)处理的例子,上面所述的时间戳所表示的是事件真实发生时间,而非事件处理的时间(Processing-Time) 。事件时间(Event-Time)处理的强大之处在于,无论是在处理当前的数据还是重新处理历史(数据重放)的数据,基于事件时间创建的流计算应用都可以保证最终执行结果是一致的。
假设我们现在正在尝试创建一个流计算排序算子。即将一个乱序到达的事件流按照事件时间进行顺序输出。数据流中的第一个元素的事件时间是 4,但是我们不能直接将它作为排序后数据流的第一个元素进行输出。因为数据是乱序到达的,也许有一个更早发生的数据还没有到达。实际上,我们在上面的例子中可以提前预知到这个流中元素2 的事件事件比4更早,我们的排序算子至少要等到 2 这条数据的到达后再做输出。