水位线是什么
水位线是一条随时间推进的标记,含义是「事件时间早于这个时刻的数据应当已经到齐」。它有两个作用:触发事件时间窗口的计算,以及让状态可以按时间清理而不必无限保留。生成水位线要设置允许的最大乱序程度,这个值等于对乱序的容忍上限:设得过大,窗口结果出炉明显变慢;设得过小,迟到数据会被丢弃。
基本信息
| 含义 | 事件时间早于此标记的数据应当已到齐 |
|---|---|
| 作用 | 触发窗口计算,并支持按时间清理状态 |
| 关键参数 | 允许的最大乱序程度 |
| 常见取值 | 数秒到数十秒,视链路延迟而定 |
| 超期数据 | 进入侧输出流,单独处理而不丢失 |
相关概念
| 概念 | 说明 | 设置建议 |
|---|---|---|
| 事件时间 | 数据自带的时间戳 | 源数据必须携带可靠的时间字段 |
| 水位线延迟 | 允许的乱序上限 | 按链路延迟与业务容忍度取值 |
| 空闲分区 | 某分区长期无数据,水位线不推进 | 开启空闲检测,避免窗口永不触发 |
| 迟到数据 | 水位线推进后到达的数据 | 用侧输出流收集,或调大延迟重算 |
水位线设置
水位线设置
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 延迟再加一点余量。
迟到数据被丢弃通常没有明显报错:窗口结果看起来正常,只是总量偏小。生产上应把超期数据接入侧输出流并监控其数量,数量持续增长说明水位线延迟偏小,或者上游出现了长延迟。