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() ------ 获取侧输出流

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值