Flink中Window详解之Window分类

Windows 计算是流式计算中非常常用的数据计算方式之一,通过按照固定时间或长度将 数据流切分成不同的窗口,然后对数据进行相应的聚合运算,从而得到一定时间范围内的统 计结果。例如统计最近 5 分钟内某基站的呼叫数,此时基站的数据在不断地产生,但是通过 5 分钟的窗口将数据限定在固定时间范围内,就可以对该范围内的有界数据执行聚合处理, 得出最近 5 分钟的基站的呼叫数量。

Window 分类
1.Global Window 和 Keyed Window
在运用窗口计算时,Flink根据上游数据集是否为KeyedStream类型,对应的Windows 也 会有所不同。

  • Keyed Window:上游数据集如果是 KeyedStream 类型,则调用 DataStream API 的 window() 方法,数据会根据 Key 在不同的 Task 实例中并行分别计算,最后得出针对每个 Key 统 计的结果。
  • Global Window:如果是 Non-Keyed 类型,则调用 WindowsAll()方法,所有的数据都会在窗口算子中由到一个 Task 中计算,并得到全局统计结果。
val data = streamEnv.readTextFile(getClass.getResource("/station.log").getPath) .map(line=>{ var arr =line.split(",") new StationLog(arr(0).trim,arr(1).trim,arr(2).trim,arr(3).trim,arr(4).trim.toLong,arr(5).trim.to Long) })  data.windowAll(自定义的WindowAssigner)  data.keyBy(_.sid)  .window(自定义的WindowAssigner)

2.Time Window 和 Count Window
基于业务数据的方面考虑,Flink 又支持两种类型的窗口,一种是基于时间的窗口叫 Time Window。还有一种基于输入数据数量的窗口叫 Count Window
3.Time Window(时间窗口)
根据不同的业务场景,Time Window 也可以分为三种类型,分别是滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)

  1. 滚动窗口(Tumbling Window)
    滚动窗口是根据固定时间进行切分,且窗口和窗口之间的元素互不重叠。这种类型的窗 口的最大特点是比较简单。只需要指定一个窗口长度(window size)。
    Flink中Window详解之Window分类
data.map(stationLog=>((stationLog.sid,1))) .keyBy(_._1) .timeWindow(Time.seconds(5)) .sum(1)

其中时间间隔可以是 Time.milliseconds(x)、Time.seconds(x)或 Time.minutes(x)。

  1. 滑动窗口(Sliding Window)
    滑动窗口也是一种比较常见的窗口类型,其特点是在滚动窗口基础之上增加了窗口滑动 时间(Slide Time),且允许窗口数据发生重叠。当 Windows size 固定之后,窗口并不像 滚动窗口按照 Windows Size 向前移动,而是根据设定的 Slide Time 向前滑动。窗口之间的 数据重叠大小根据 Windows size 和 Slide time 决定,当 Slide time 小于 Windows size 便会发生窗口重叠,Slide size 大于 Windows size 就会出现窗口不连续,数据可能不能在 任何一个窗口内计算,Slide size 和 Windows size 相等时,Sliding Windows 其实就是 Tumbling Windows。
    Flink中Window详解之Window分类
data.map(stationLog=>((stationLog.sid,1))) .keyBy(_._1) .timeWindow(Time.seconds(5),Time.seconds(3)) .window(SlidingEventTimeWindows.of(Time.seconds(5),Time.seconds(3))) .sum(1)
  1. 会话窗口(Session Window)
    会话窗口(Session Windows)主要是将某段时间内活跃度较高的数据聚合成一个窗口 进行计算,窗口的触发的条件是 Session Gap,是指在规定的时间内如果没有数据活跃接入, 则认为窗口结束,然后触发窗口计算结果。需要注意的是如果数据一直不间断地进入窗口, 也会导致窗口始终不触发的情况。与滑动窗口、滚动窗口不同的是,Session Windows 不需 要有固定 windows size 和 slide time,只需要定义 session gap,来规定不活跃数据的时 间上限即可。
    Flink中Window详解之Window分类
data.map(stationLog=>((stationLog.sid,1))) .keyBy(_._1) .window(EventTimeSessionWindows.withGap(Time.seconds(3))) .sum(1)

Original: https://blog.51cto.com/u_15704423/5434856
Author: wx62be9d88ce294
Title: Flink中Window详解之Window分类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516948/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球