Flink源码分析-窗口

窗口机制是Flink流处理的核心,它将无限元素的流分割成有限元素的集合(窗口)。当一个窗口不再增加新元素时,就可以对这个窗口中的所有元素执行计算逻辑。

前言

从一个需求说起,业务方要实时计算每个商品在过去十分钟的展现、点击、购买数量来做运营活动,延迟不能超过一秒。商品的展现、点击、购买日志都会投递到消息队列,QPS大概在10W左右,计算结果存储在你redis中。

由于涉及到运营活动,数据的准确性和及时性非常重要。我们先思考下不借助框架,应该如何去实现这个需求,都有哪些实现方式?

这种需求的实现方式有多种,其中一种就是Window(窗口)。大致过程为把无限元素的流按时间 分割成有限元素的集合窗口)。当窗口中元素不再新增元素时,对窗口中的元素执行计算逻辑,然后将计算结果发送给下游。当窗口中如果元素数量过多导致占用过多内存时,就需要预先执行增量计算来减少元素数量。从这个过程中,可以总结出三个核心的功能点:

  • 分割窗口方式
  • 窗口达到稳定状态时机
  • 计算方式

在实际的应用场景中,还要考虑边界条件:

  • 窗口元素过多,导致计算太慢或者占用内存过多
  • 当一个窗口结束时,又收到应该属于这个窗口的元素

窗口分割方式

窗口类型:

  • 滚动窗口
  • 滑动窗口
  • 会话窗口

时间:

  • 事件发生时间
  • 收到事件时间
  • 处理事件时间

滚动窗口

滑动窗口

会话窗口

窗口触发器

窗口方法

ReduceFunction

AggregateFunction

FoldFunction

ProcessWindowFunction

延迟


参考:

  1. Flink Windows

评论