首页/数据/数据工程与 ETL 速查/流处理窗口类型:滚动/滑动/会话/累计
管道基础52 条

流处理窗口类型:滚动/滑动/会话/累计

窗口把无界流切成可聚合的片段:滚动窗口不重叠、滑动窗口按步长重叠、会话窗口按活跃间隔切分、累计窗口在同一周期内逐段累加。

窗口是什么

无界流永远没有「数据到齐」的时刻,因此不能像批处理那样做全局聚合。窗口的作用是把无界流按时间或活跃度切成一段段有限的区间,让聚合有明确的输入边界:每个窗口独立计算,结果在窗口结束后输出。

四类窗口

滚动窗口(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);
窗口大小要与业务节奏匹配:支付风控看秒级,日报看天级。所有场景套同一套窗口,会造成要么延迟过高、要么结果抖动。
滑动窗口的步长越小、窗口越长,每个事件被复制的份数越多,状态与计算量成倍增长;上线前用真实峰值流量压测,不要等状态膨胀后再回退。

易错点

  • 滑动窗口步长设得过小、窗口过长,状态与计算量成倍增长,作业很快因反压而积压
  • 会话窗口长度不可预估,长期不活跃的 key 可能形成超长窗口并持续占用状态
  • 窗口边界与批处理口径不对齐(一个按自然分钟、一个按滚动间隔),两套数字长期对不上
  • 忘记窗口依赖水位线触发:水位线不推进时窗口永不输出,表现为「有数据但没结果」

数据来源与参考

  • Apache Flink 官方文档:Windowing TVF
  • Apache Flink 官方文档:Windows
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌