首页/数据/数仓建模速查/水位线与乱序数据处理
湖仓与引擎63 条

水位线与乱序数据处理

水位线表示「事件时间早于此的输入已到齐」,用于触发窗口计算并清理状态;需按乱序程度设置延迟(常见 5-30 秒)。

数仓建模速查数据更新于 2026-10-13

水位线是什么

水位线是一条随时间推进的标记,含义是「事件时间早于这个时刻的数据应当已经到齐」。它有两个作用:触发事件时间窗口的计算,以及让状态可以按时间清理而不必无限保留。生成水位线要设置允许的最大乱序程度,这个值等于对乱序的容忍上限:设得过大,窗口结果出炉明显变慢;设得过小,迟到数据会被丢弃。

基本信息

含义事件时间早于此标记的数据应当已到齐
作用触发窗口计算,并支持按时间清理状态
关键参数允许的最大乱序程度
常见取值数秒到数十秒,视链路延迟而定
超期数据进入侧输出流,单独处理而不丢失

相关概念

概念说明设置建议
事件时间数据自带的时间戳源数据必须携带可靠的时间字段
水位线延迟允许的乱序上限按链路延迟与业务容忍度取值
空闲分区某分区长期无数据,水位线不推进开启空闲检测,避免窗口永不触发
迟到数据水位线推进后到达的数据用侧输出流收集,或调大延迟重算

水位线设置

水位线设置
CREATE TABLE orders (
  order_id STRING,
  store_id STRING,
  pay_amt  DECIMAL(18,2),
  event_time TIMESTAMP(3),
  -- 水位线:允许 10 秒乱序,超过则视为迟到
  WATERMARK FOR event_time AS event_time - INTERVAL '10' SECOND
) WITH (
  'connector' = 'kafka',
  'topic' = 'trade_events',
  'properties.bootstrap.servers' = 'broker:9092',
  'format' = 'json'
);
水位线延迟设得过大,窗口结果出炉变慢;设得过小则迟到数据被丢弃。取值应基于观测到的链路延迟分布,而不是凭感觉,例如按 P99 延迟再加一点余量。
迟到数据被丢弃通常没有明显报错:窗口结果看起来正常,只是总量偏小。生产上应把超期数据接入侧输出流并监控其数量,数量持续增长说明水位线延迟偏小,或者上游出现了长延迟。

易错点

  • 延迟设置过小:迟到数据被静默丢弃,结果偏小且没有告警
  • 延迟设置过大:窗口迟迟不关,实时看板的数据更新明显滞后
  • 某分区长期无数据却不开启空闲检测:水位线不推进,窗口永不触发
  • 源数据时间字段不可靠(例如取的是处理时间):水位线失去意义,结果不可复现
  • 超期数据不落侧输出流:数据直接丢失,事后无法补算

数据来源与参考

  • Apache Flink 官方文档:Generating Watermarks
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌