Flink中 Keyed与Non-Keyed Windows 和 Window Assigners(分配器)

Keyed与Non-Keyed Windows

Flink根据DataStream在窗口之前是否进行keyBy操作将窗口分为keyed窗口和Non-keyeds窗口,所以这两种窗口的定义就非常明了:

  • Keyed Windows:在keyBy()流中上应用窗口操作。使用window()操作,下游操作可以多个并行度,即每个分组都有自己的单独窗口,窗口逻辑可以在多个Task下执行。
  • Non-Keyed Windows:在非keyBy()流上进行窗口操作,只能使用windowAll()操作,下游操作并行度只能为1,即所有的窗口逻辑只能在一个Task上执行。

Flink的窗口应用程序代码结果顺序如下:

// Keyed Window
stream
       .keyBy(...)               <-  按照一个Key进行分组
       .window(...)              <-  将数据流中的元素分配到相应的窗口中,下游操作可以是多个并行度。
      [.trigger(...)]            <-  指定触发器Trigger(可选)
      [.evictor(...)]            <-  指定清除器Evictor(可选)
       .reduce/aggregate/process()      <-  窗口处理函数Window Function

// Non-Keyed Window
stream
       .windowAll(...)           <-  不分组,将数据流中的所有元素分配到相应的窗口中,下游操作只能是一个并行度。
      [.trigger(...)]            <-  指定触发器Trigger(可选)
      [.evictor(...)]            <-  指定清除器Evictor(可选)
       .reduce/aggregate/process()      <-  窗口处理函数Window Function

根据上述窗口程序代码结果可知,trigger(触发器),evictor(清除器)都是可选项,所以Flink窗口程序必须包含两部分:

  • window…(): 窗口,即窗口分配器(WindowAssigner),用于将数据流中的元素分配到对应的窗口。
  • reduce/aggregate/process(): 窗口处理函数,当满足窗口触发条件后,对窗口内的数据使用窗口处理函数(Window Function) 进行处理,常用的Window Function有reduce,aggregate,process

Window Assigners(分配器)

WindowAssigner负责将每个传入的元素分配给一个或多个窗口。Flink提供丰富窗口类型及相应的内置窗口分配器,如下:

  • 滚动窗口分配器:适用于滚动窗口
  • 滑动窗口分配器:适用于滑动窗口
  • 会话窗口分配器:适用于会话窗口
  • 全局窗口分配器:适用于全局窗口
  • 自定义窗口分配器:你也可以通过扩展WindowAssigner类来实现一个自定义窗口分配器。
    所有内置的窗口分配器(全局窗口除外)都根据时间将元素赋值给窗口,时间可以是处理时间,也可以是事件时间和摄入时间。
    基于时间的窗口有一个窗口开始时间戳(包含)和一个窗口结束时间戳(不包含),即窗口区间为左包右不包,它们一起描述了窗口的大小。在代码中,Flink在处理基于时间的窗口时使用TimeWindow,该窗口支持三种时间戳获取:
  • 获取窗口开始时间戳
  • 获取窗口结束时间戳
  • 还有一个额外获取窗口允许的最大时间戳.max.Timestamp()方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值