Windows 是处理无限流的核心,Windows 将流分成有限大小的“存储桶”(buckets),Flink 会在在其上应用计算。
对 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 中,原始流不会被分割成多个逻辑流,所有的窗口化逻辑都将由同一个任务执行(并行度为 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 assigner 负责将每个传入元素分配给一个或多个窗口,定义了如何将元素分配给窗口。这是通过在 window() 或 windowAll() 调用中指定所选的 WindowAssigner 来完成的。
Flink 预设了一系列典型场景的 windows assigner :
这些窗口种类都包括基于时间窗口分配的 TimeWindows 子实现,具有开始时间戳 start timestamp、结束时间戳 end timestamp 的基本属性,用于描述窗口的最大尺寸。
同时还可以通过扩展 WindowAssigner 类来实现自定义窗口分配器。