Watermark 与窗口:实时计算如何处理乱序数据
实时计算不能只按处理时间看数据,Event Time、Watermark、窗口和迟到数据策略共同决定指标是否可信。
Watermark 与窗口:实时计算如何处理乱序数据
实时数据不是按整齐顺序到来的。用户手机时间可能不准,网络可能延迟,Kafka 里不同分区的事件也可能交错。
如果只按处理时间计算指标,迟到事件会让结果偏差很大。
Rendering diagram...
Event Time 和 Processing Time
Event Time 是事件实际发生时间。Processing Time 是计算引擎处理事件的时间。
用户 10:00 点击按钮,10:03 才上报到系统。Event Time 是 10:00,Processing Time 是 10:03。
做用户行为分析时,通常更关心 Event Time。
Watermark
Watermark 表示系统认为某个时间之前的数据大概率已经到齐。
比如 Watermark = 当前最大事件时间 - 10 秒,表示允许 10 秒乱序。
CREATE TABLE user_events (
user_id STRING,
event_time TIMESTAMP(3),
WATERMARK FOR event_time AS event_time - INTERVAL '10' SECOND
);
Watermark 太激进,迟到数据会被丢或进入迟到逻辑。Watermark 太保守,窗口结果会更晚输出。
窗口类型
滚动窗口没有重叠,比如每 1 分钟统计一次。
滑动窗口有重叠,比如每 10 秒输出最近 1 分钟指标。
会话窗口按用户行为间隔切分,比如 30 分钟无行为就关闭一个 session。
迟到数据
迟到数据有几种处理方式:
- 丢弃。
- 进入侧输出流。
- 更新历史结果。
- 触发补偿计算。
选择哪种方式,取决于指标是否允许修正。
小结
Watermark 和窗口是实时计算的时间语义基础。它们解决的不是“怎么更快”,而是“乱序数据下怎么算得更可信”。