Watermark

Watermark是一种衡量Event Time进展的机制,它是数据本身的一个隐藏属性,watermark的定义是source表DDL定义的一部分。数栈无需在SQL语句中显示定义一个watermark,而是在页面中可指定字段,并配置偏移量,页面的配置方法请参考快速启动中的 数据开发

案例

通常一条记录中的某个字段就代表了该记录的发生时间,比如表中有个rowtime字段,类型为Timestamp,其中某一值为1501750584000(2017-08-03 08:56:24.000)。那么如果用户需要定义一个基于该rowtime列的watermark,watermark策略为偏移4秒,那么,这条数据的watermark时间就是1501750584000 - 4000 = 1501750580000(2017-08-03 08:56:20.000)。这条数据的watermark时间是什么含义呢?即:timestamp小于1501750580000(2017-08-03 08:56:20.000)的数据,都已经到达了。

总结

  1. WaterMark的含义是所有时间t’< t的事件都已经发生。假如Watermark t已经生效,那么后续EventTime小于t的记录都会被丢掉(暂时blink的做法是丢弃这些来的更晚的数据,以后会给用户配置,让更晚的数据也能继续update)。

  2. 针对乱序的的流,WaterMark至关重要,这样即使一些事件延迟到达,也不至于过于影响window窗口的计算的正确性。

  3. 并行数据流中,当Operator有多个输入流时,Operator的event time以最小流event time为准,图示如下:

1576460890452 90bfa4d0 175e 43f7 b2af a1044eb128df

最后,给出一个使用event time做aggregate的例子:

SELECT user, SUM(amount)
FROM Orders
GROUP BY TUMBLE(rowtime, INTERVAL '1' DAY), user