当前位置:   article > 正文

35、Flink 的窗口生命周期详解

35、Flink 的窗口生命周期详解
窗口
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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意:方括号([…])中的命令是可选的,Evictor 在 Python DataStream API 中不支持。

2.窗口的生命周期

一个窗口在第一个属于它的元素到达时就会被创建,然后在时间(event 或 processing time) 超过窗口的“结束时间戳 + 用户定义的 allowed lateness 时“被完全删除

Flink 仅保证删除基于时间的窗口,其他类型的窗口不做保证, 比如全局窗口。

例如,对于一个基于 event time 且范围互不重合(滚动)的窗口策略,如果窗口设置的时长为五分钟、可容忍的迟到时间(allowed lateness)为 1 分钟, 那么第一个元素落入 12:0012:05 这个区间时,Flink 就会为这个区间创建一个新的窗口,当 watermark 越过 12:06 时,这个窗口将被删除。

每个窗口会设置自己的 Trigger 和 function (ProcessWindowFunctionReduceFunction、或 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。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/606498
推荐阅读
相关标签
  

闽ICP备14008679号