Flink 水位线(Watermark)(一)

298 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

水位线

在实际应用中,一般会采用事件时间语义。而水位线,就是基于事件时间(EventTime)提出的概念。一个数据产生的时刻,就是流处理中事件触发的时间点,这就是“事件时间”,一般都会以时间戳的形式作为一个字段(timestamp)记录在源数据里。如果我们想要统计一段时间内的数据,需要划分时间窗口,这时只要判断一下时间戳就可以知道数据属于哪个窗口了。 窗口处理的是有界数据,我们需要等窗口的数据都到齐了,才能计算出最终的统计结果。

比如我们想统计 8 点~9 点的用户点击量,那就是从 8 点开始收集数据,到 9点截止,将收集的数据做处理计算。这有点类似于班车,每小时发一班,那么8 点之后来的人都会上同一班车,到 9 点钟准时发车;9 点之后来的人,就只好等下一班 10点发的车了。

这里的关键问题是,“9 点钟发车”,到底是看谁的表来定时间? 请看

处理时间语义(ProcessTime)下,都是以当前任务所在节点的系统时间为准的。在分布式环境下,这样会因为网络传输延迟的不确定而导致误差。比如有些商品在 8 点 59 分 59 秒生产出来,可是从下生产线到运至车上又要花费几秒,那就赶不上 9 点钟这班车了。

先后生产出的商品,到达车上的顺序也可能乱掉:统计结果的正确性受到了影响。

所以在实际中我们往往需要以事件时间为准。如果考虑事件时间,情况就复杂起来了。现在不能直接用每辆车上挂的钟(系统时间),又没有统一的时钟,那该怎么确定发车时间呢?

其他时间语义下,请看(二)第二篇文章。