Flink 的窗口机制

发布于:2025-05-19 ⋅ 阅读:(15) ⋅ 点赞:(0)

🪟 1. 基于时间驱动的滚动时间窗口(Tumbling Time Window - Time-based)

✅ 定义:

  • 每隔固定的时间周期开启一个新的窗口。
  • 窗口之间不重叠

🕒 示例:

DataStream<Tuple2<String, Integer>> windowedStream = stream
    .keyBy(keySelector)
    .window(TumblingEventTimeWindows.of(Time.seconds(5))) // 每5秒一个窗口
    .sum(1);

🔍 特点:

属性 描述
类型 Keyed 或 Non-Keyed
时间戳 依赖事件时间或处理时间
触发机制 固定时间触发
应用场景 统计每 N 秒的数据总量(如每分钟订单数)

🧊 2. 基于事件驱动的滚动时间窗口(Tumbling Count Window - Event-based)

✅ 定义:

  • 每收集固定数量的元素后触发一次窗口计算。
  • 不依赖时间,只依赖元素个数。

📏 示例:

DataStream<Tuple2<String, Integer>> windowedStream = stream
    .keyBy(keySelector)
    .countWindow(10) // 每收到10条数据就触发一次计算
    .sum(1);

🔍 特点:

属性 描述
类型 Keyed 或 Non-Keyed
时间戳 无时间概念,仅按元素数量划分
触发机制 元素数量达到设定值
应用场景 当数据量稳定但时间不确定时使用(如每100个传感器读数统计一次)

⏱️ 3. 基于时间驱动的滑动时间窗口(Sliding Time Window - Time-based)

✅ 定义:

  • 窗口每隔一定时间“滑动”一次,窗口长度固定。
  • 窗口之间有重叠

🕒 示例:

DataStream<Tuple2<String, Integer>> windowedStream = stream
    .keyBy(keySelector)
    .window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5))) // 窗口长10s,每5s滑动一次
    .sum(1);

🔍 特点:

属性 描述
类型 Keyed 或 Non-Keyed
时间戳 依赖事件时间或处理时间
触发机制 固定时间间隔触发
应用场景 需要连续、实时更新统计数据(如每5秒查看过去10秒的平均值)

📐 4. 基于事件驱动的滑动时间窗口(Sliding Count Window - Event-based)

✅ 定义:

  • 每隔固定数量的元素滑动一次窗口,窗口长度也以元素个数为单位。
  • 窗口之间可以部分重叠。

📏 示例:

DataStream<Tuple2<String, Integer>> windowedStream = stream
    .keyBy(keySelector)
    .countWindow(10, 5) // 窗口包含10个元素,每5个元素滑动一次
    .sum(1);

🔍 特点:

属性 描述
类型 Keyed 或 Non-Keyed
时间戳 无时间概念,仅基于元素数量
触发机制 元素数量达到设定滑动步长
应用场景 数据速率不均,需要定期更新统计(如每100个请求统计前200个的平均响应时间)

🛎️ 5. 会话窗口(Session Window)

✅ 定义:

  • 根据活动间隙(gap) 来划分窗口。
  • 如果两个元素之间的时间差超过设定的 gap,则属于不同的窗口。

🕒 示例:

DataStream<Tuple2<String, Integer>> windowedStream = stream
    .keyBy(keySelector)
    .window(EventTimeSessionWindows.withGap(Time.minutes(1))) // 1分钟内无新事件视为会话结束
    .sum(1);

🔍 特点:

属性 描述
类型 Keyed 或 Non-Keyed
时间戳 通常基于事件时间
触发机制 检测到会话间隔(gap)
应用场景 用户行为分析(如点击流、登录日志等),识别用户活跃时间段

📊 总结对比表

窗口类型 划分依据 是否重叠 触发条件 示例
滚动时间窗口 时间 时间到达 TumblingEventTimeWindows.of(Time.seconds(5))
滚动计数窗口 元素个数 数量达到 countWindow(10)
滑动时间窗口 时间 时间滑动 SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5))
滑动计数窗口 元素个数 数量滑动 countWindow(10, 5)
会话窗口 事件间隔 动态 间隔超过gap EventTimeSessionWindows.withGap(Time.minutes(1))

✅ 选择建议

场景 推荐窗口类型
实时监控每 N 秒汇总一次 滚动时间窗口
数据按批次处理(如每100条) 滚动计数窗口
需要平滑的实时指标(如移动平均) 滑动时间窗口
数据频率不规则但需定期统计 滑动计数窗口
分析用户行为(如点击流、登录会话) 会话窗口

网站公告

今日签到

点亮在社区的每一天
去签到