赞
踩
窗口(Window)可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。
Flink 窗口在 keyed streams 和 non-keyed streams 上使用的基本结构,这两者唯一的区别仅在于:keyed streams 要调用 keyBy(...)
后再调用 window(...)
, 而 non-keyed streams 直接调用 windowAll(...)
。
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"
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 中不支持。
一个窗口在第一个属于它的元素到达时就会被创建,然后在时间(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 可以在窗口函数的前后删除数据。
在定义窗口前需确定 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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。