一、功能
问题:Flink实时计算使用窗口时,消息会乱序,使用Event Time计算时,会有消息晚到。
解决方案:假设我们把延迟超过5秒的消息丢掉(或特殊处理),那么在每条消息上打一个时间戳(watermark 水位线),这个时间是事件时间减去5s,表示的含义是这个水位线之前的数据都到了,告诉窗口可以出发计算了。
补充时间概念:
(1)事件时间:业务系统的业务发生或更新时间。
(2)抽取时间:进入到消息队列的时间。
(3)处理时间:实时计算的时间。
二、原理
1、watermark本质是一个时间戳。
2、watermark要解决的是乱序问题。
3、窗口触发:当watermark时间戳大于窗口的结束时间。
三、如何使用
1、Flink SQL
需要在建表时声明。
CREATE TABLE user_actions (
user_name STRING,
data STRING,
user_action_time TIMESTAMP(3),
-- 声明 user_action_time 是事件时间属性,并且用 延迟 5 秒的策略来生成 watermark
WATERMARK FOR user_action_time AS user_action_time - I