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 和窗口是实时计算的时间语义基础。它们解决的不是“怎么更快”,而是“乱序数据下怎么算得更可信”。

参考链接