窗口是什么
无界流永远没有「数据到齐」的时刻,因此不能像批处理那样做全局聚合。窗口的作用是把无界流按时间或活跃度切成一段段有限的区间,让聚合有明确的输入边界:每个窗口独立计算,结果在窗口结束后输出。
四类窗口
滚动窗口(TUMBLE)固定长度且互不重叠,最常用于「每分钟订单量」;滑动窗口(HOP)固定长度但按步长重叠,同一个事件会落入多个窗口;会话窗口(SESSION)按活跃间隔切分,静默超过阈值就断开;累计窗口(CUMULATE)在同一周期内逐段累加输出,适合「当天累计到现在」这类持续增长的口径。
基本信息
| 滚动窗口 | TUMBLE,固定长度、不重叠,每个事件属于唯一窗口 |
|---|---|
| 滑动窗口 | HOP,长度大于步长时重叠,事件可能属于多个窗口 |
| 会话窗口 | SESSION,按活跃间隔切分,长度不固定 |
| 累计窗口 | CUMULATE,同一周期内按步长逐段输出累加值 |
| 状态开销 | 重叠越多、窗口越长,状态与计算量越大 |
窗口选型
| 业务需求 | 推荐窗口 | 说明 |
|---|---|---|
| 每分钟订单量 | 滚动 1 分钟 | 互不重叠,最常用也最省状态 |
| 近 5 分钟成交额,每 10 秒刷新 | 滑动 5 分钟、步长 10 秒 | 重叠计算,状态开销约为长度除步长的倍数 |
| 用户会话行为分析 | 会话窗口,间隔 30 分钟 | 超过静默阈值即切分,窗口长度不固定 |
| 当天累计 GMV 走势 | 累计窗口,天周期、小时步长 | 同一周期内多次输出逐步增长的累计值 |
典型使用场景
- 实时看板:按固定滚动窗口统计分钟级指标,最容易解释和核对
- 风控规则:滑动窗口计算近几分钟的行为次数,滚动窗口做不到重叠判断
- 用户行为分析:会话窗口把一次连续访问归为一段,用于停留时长与路径分析
- 大盘累计走势:累计窗口每小时输出当日累计值,不必等全天结束
- 对账核对:窗口边界与批处理口径对齐(如整点切分),减少两套数字的差异
Flink SQL 窗口写法
Flink SQL 窗口写法
-- 滚动:1 分钟一个窗口,互不重叠
SELECT TUMBLE_START(ts, INTERVAL '1' MINUTE) AS w, COUNT(*)
FROM orders GROUP BY TUMBLE(ts, INTERVAL '1' MINUTE);
-- 滑动:窗口 5 分钟、每 10 秒滑动一次(前两个参数是步长与窗口长度)
SELECT HOP_START(ts, INTERVAL '10' SECOND, INTERVAL '5' MINUTE) AS w, SUM(amount)
FROM orders GROUP BY HOP(ts, INTERVAL '10' SECOND, INTERVAL '5' MINUTE);
-- 会话:静默 30 秒即切分为新窗口
SELECT SESSION_START(ts, INTERVAL '30' SECOND) AS w, COUNT(*)
FROM orders GROUP BY SESSION(ts, INTERVAL '30' SECOND);窗口大小要与业务节奏匹配:支付风控看秒级,日报看天级。所有场景套同一套窗口,会造成要么延迟过高、要么结果抖动。
滑动窗口的步长越小、窗口越长,每个事件被复制的份数越多,状态与计算量成倍增长;上线前用真实峰值流量压测,不要等状态膨胀后再回退。