窗口
1.概述
窗口(Window)可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。
Flink 窗口在 keyed streams 和 non-keyed streams 上使用的基本结构,这两者唯一的区别仅在于:keyed streams 要调用 keyBy(...)后再调用 window(...) , 而 non-keyed streams 直接调用 windowAll(...)。
a)Keyed Windows
stream .keyBy(...) <- 仅 keyed 窗口需要 .window(...) <- 必填项:"assigner" [.trigger(...)] <- 可选项:"trigger" (省略则使用默认 trigger) [.evictor(...)] <- 可选项:"evictor" (省略则不使用 evictor) [.allowedLateness(...)] <- 可选项:"lateness" (省略则为 0) [.sideOutputLateData(...)] <- 可选项:"output tag" (省略则不对迟到数据使用 side output) .reduce/aggregate/apply() <- 必填项:"function" [.getSideOutput(...)] <- 可选项:"output tag"
b)Non-Keyed Windows
stream .windowAll(...) <- 必填项:"assigner" [.trigger(...)] <- 可选项:"trigger" (else default trigger) [.evictor(...)] <- 可选项:"evictor" (else no evictor) [.allowedLateness(...)] <- 可选项:"lateness" (else zero) [.sideOutputLateData(...)] <- 可选项:"output tag" (else no side output for late data) .reduce/aggregate/apply() <- 必填项:"function" [.getSideOutput(...)] <- 可选项:"output tag"
注意:方括号([…])中的命令是可选的,Evictor 在 Python DataStream API 中不支持。
2.窗口的生命周期
一个窗口在第一个属于它的元素到达时就会被创建,然后在时间(event 或 processing time) 超过窗口的“结束时间戳 + 用户定义的 allowed lateness 时“被完全删除。
Flink 仅保证删除基于时间的窗口,其他类型的窗口不做保证, 比如全局窗口。
例如,对于一个基于 event time 且范围互不重合(滚动)的窗口策略,如果窗口设置的时长为五分钟、可容忍的迟到时间(allowed lateness)为 1 分钟, 那么第一个元素落入 12:00 至 12:05 这个区间时,Flink 就会为这个区间创建一个新的窗口,当 watermark 越过 12:06 时,这个窗口将被删除。
每个窗口会设置自己的 Trigger 和 function (ProcessWindowFunction、ReduceFunction、或 AggregateFunction),该 function 决定如何计算窗口中的内容, 而 Trigger 决定窗口中的数据何时可以被 function 计算;Trigger 的触发(fire)条件可能是“当窗口中有多于 4 条数据”或“当 watermark 越过窗口的结束时间”等;Trigger 还可以在 window 被创建后、删除前的这段时间内定义何时清理(purge)窗口中的数据;此处数据仅指窗口内的元素,不包括窗口的 meta data,即窗口在 purge 后仍然可以加入新的数据。
还可以指定一个 Evictor ,在 trigger 触发之后,Evictor 可以在窗口函数的前后删除数据。
3.Keyed 和 Non-Keyed Windows
在定义窗口前需确定 stream 是 keyed 还是 non-keyed, keyBy(...) 会将无界 stream 分割为逻辑上的 keyed stream。
对于 keyed stream,其中数据的任何属性都可以作为 key,使用 keyed stream 允许窗口计算由多个 task 并行,因为每个逻辑上的 keyed stream 都可以被单独处理,属于同一个 key 的元素会被发送到同一个 task。
对于 non-keyed stream,原始的 stream 不会被分割为多个逻辑上的 stream, 所有的窗口计算会被同一个 task 完成,也就是 parallelism 为 1。
还没有评论,来说两句吧...