Windows

Keyed Windows 和 None-Keyed Windows


Windows 是处理无限流的核心,Windows 将流分成有限大小的“存储桶”(buckets),Flink 会在在其上应用计算。

Keyed Windows

对 Keyed Windows 创建的 Windows,每一个逻辑 KeyedStream 都可以独立于其他流进行处理,所有指向同一个 Key 的元素都将被发送到同一个并行任务。

stream
       .keyBy(...)               <-  keyed versus non-keyed windows
       .window(...)              <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"

None-Keyed Windows

在 None-Keyed Windows 中,原始流不会被分割成多个逻辑流,所有的窗口化逻辑都将由同一个任务执行(并行度为 1)。

stream
       .windowAll(...)           <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"

Window Assigners 窗口分配器


window assigner 负责将每个传入元素分配给一个或多个窗口,定义了如何将元素分配给窗口。这是通过在 window() 或 windowAll() 调用中指定所选的 WindowAssigner 来完成的。

Flink 预设了一系列典型场景的 windows assigner :

这些窗口种类都包括基于时间窗口分配的 TimeWindows 子实现,具有开始时间戳 start timestamp、结束时间戳 end timestamp 的基本属性,用于描述窗口的最大尺寸。

同时还可以通过扩展 WindowAssigner 类来实现自定义窗口分配器。