微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flink学习笔记之 Window

类似SparkStreaming这种流式计算,但我们处理无限数据集已经由 批处理转向到流处理,而window 是一种切割无限数据为有限块进行处理的。
Window 是无线数据流处理的核心, Window 将一个无限的 stream 拆分成有限大小的 "buckets" 桶, 可以在这些桶上进行操作计算。

Window 类型

Window 可以分成两类:

  • Countwindow:按照指定的数据条数生成一个 Window, 与时间无关。
  • TimeWindow: 按照时间生成 Window。

对于 TimeWindow, 可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling Window)滑动窗口(Sliding Window) 会话窗口 (Session Window)

  1. 滚动窗口(Tumbling Windows)
    将数据依据固定的窗口长度对数据进行切片。
    特点时间对齐, 窗口长度固定,没有重叠

    滚动窗口分配器将每个元素分配到一个指定窗口大小的窗口中,滚动窗口由一个固定的大小,并不会出现重叠。
     
  2. 滑动窗口(Sliding Windows)
    滑动窗口是固定窗口的更广义的一种形式,滑动窗口是由固定的窗口长度滑动间隔组成。
    特点时间对齐,窗口长度固定,可以有重叠。
     
  3. 会话窗口(Session Windows)
    由一系列事件组合一个指定时间长度的 timeout 间隙组成。 类似于 Web 应用的 session。也就是一段时间没有接收到新数据就会生成新的窗口。
    特点:时间无对齐。

Window API

  • 窗口分配器 -----  window() 方法
  • 我们可以用.window() 来定义一个窗口,然后基于这个 window去做一些聚合或者其它 处理操作。注意 window() 方法必须在 keyBy之后才能用。
  • Flink 提供了更加简单的 .timeWindow 和 .countwindow 方法, 用于定义时间窗口和计数窗口。

窗口分配器(window assigner)

  • Window() 方法接收的输入参数是一个 WindowAssigner
  • WindowAssigner 负责将每条输入的数据分发到正确的 window 中
  • Flink 提供了 通用的 WindowAssigner
    > 滚动窗口 (tumbling window)
    > 滑动窗口 (sliding window)
    > 会话窗口 (session window)
    > 全局窗口 (global window)

创建不同类型的窗口

  • 滚动事件窗口(tumbling time window)
            
    .timeWindow(Time.seconds(15))

     

  • 滑动时间窗口(sliding time window)
     

    .timeWindow(Time.seconds(15),Time.seconds(5))

     

  • 会话窗口(session window)
     

    .window(EventTimeSessionWindows.withGap(Time.minutes(10)))

     

  • 滚动计数窗口(tumbling count window)
     

    .countwindow(5)

     

  • 滚动计数窗口(sliding count window)
     

    .countwindow(10,2)

     

窗口函数(window function)

  • window function 定义了要对窗口中收集的数据做的计算操作
  • 可以分为两类
    > 增量聚合函数 (incremental aggregation functions)
          > 每条数据到来就进行计算,保持一个简单的状态
          > ReduceFunction, AggregateFunction
    > 全窗口函数 (full window functions)
       
      > 先把窗口所有数据收集起来,等到计算的时候会遍历所有数据
          > ProcessWindowFunction, WindowFunction
     

其他可选API

  • .tigger() -----  触发器
       定义  window 什么时候关闭, 触发计算并输出结果
  • .evitor() -----  移除器
       定义移除某些数据的逻辑
  • .allowedLateness()  ------  允许迟到的数据
  • .sideOutputLateData() ------ 将迟到的数据放入侧输出
  • .getSideOutput() ------ 获取输出

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐