Flink入门(四) -- Flink中的窗口

对Flink还没有了解的小伙伴们可以参考我的前几期博客

Flink的入门

Flink程序的编写

什么是窗口?

1. 建筑物中的窗户


窗口通常指的是建筑物中用来采光和通风的构件,即窗户。这是“窗口”一词最直接和常见的含义。


2. 售票处、挂号室等的窗形开口


特定场所应用:在一些特定的公共场所,如售票处、挂号室等,墙上会开有窗形的口子,这些口子有活扇可以开关,用于提供服务,也被称为“窗口”。
 

3.Flink中的窗口

Windows是Flink处理无限流的核心。Windows将流拆分为有限大小的“桶”(buckets),我们可以在其上应用计算。

Flink的窗口类型

flink支持两种划分窗口的方式(time和count) 根据时间划分窗口,那么它就是一个time-window 如果根据数据划分窗口,那么它就是一个count-window。

size=interval

就会形成tumbling-window(无重叠数据)。

如下图

size<interval

形成sliding-window(有重叠数据)。

如下图

size>interval

会有部分数据会丢失。

根据有无重叠数据,和time||count,我们可以将窗口分为四种类型

  • time-tumbling-window 无重叠数据的时间窗口:

  • timeWindow(Time.seconds(5))

  • time-sliding-window 有重叠数据的时间窗口:

  • timeWindow(Time.seconds(5), Time.seconds(3))

  • count-tumbling-window无重叠数据的数量窗口:

  • countWindow(5)

  • count-sliding-window 有重叠数据的数量窗口:

  • countWindow(5,3)

Session Window

会话窗口分配器按活动会话对元素进行分组。与翻转窗口和滑动窗口相比,会话窗口不重叠,也没有固定的开始和结束时间。相反,当会话窗口在一段时间内没有接收到元素时,即出现不活动间隙时,会话窗口会关闭。会话窗口分配器可以配置静态会话间隙或会话间隙提取器功能,该功能定义了不活动的时间段。当此时间段到期时,当前会话关闭,后续元素被分配给新的会话窗口。

Keyed Windows

对于键值流,首先需要通过keyBy(...)方法指定键,然后才能应用窗口化。窗口化操作通过window(...)方法实现,并且可以附加可选的触发器(Trigger)、逐出器(Evictor)、延迟数据处理策略(Allowed Lateness)以及侧输出标签(Side Output Tag)等。最后,通过reduce/aggregate/apply()方法指定在每个窗口上执行的函数。

stream  
    .keyBy(...) // 指定键  
    .window(...) // 应用窗口化  
    [.trigger(...)] // 可选:指定触发器  
    [.evictor(...)] // 可选:指定逐出器  
    [.allowedLateness(...)] // 可选:指定允许的延迟时间  
    [.sideOutputLateData(...)] // 可选:指定延迟数据的侧输出标签  
    .reduce/aggregate/apply(...) // 指定窗口函数  
    [.getSideOutput(...)] // 可选:获取侧输出

 

 Non-Keyed Windows

对于非键值流,不需要指定键,而是直接使用windowAll(...)方法应用窗口化。其余部分与键值流类似,包括可选的触发器、逐出器、延迟数据处理策略和侧输出标签,以及必须的窗口函数。

stream  
    .windowAll(...) // 应用窗口化  
    [.trigger(...)] // 可选:指定触发器  
    [.evictor(...)] // 可选:指定逐出器  
    [.allowedLateness(...)] // 可选:指定允许的延迟时间  
    [.sideOutputLateData(...)] // 可选:指定延迟数据的侧输出标签  
    .reduce/aggregate/apply(...) // 指定窗口函数  
    [.getSideOutput(...)] // 可选:获取侧输出

 

Flink Windows的生命周期

Apache Flink的窗口(Window)生命周期是处理流数据时的一个重要概念,它定义了窗口从创建到销毁的整个过程以及在这个过程中如何应用计算。

Flink的窗口生命周期从窗口的创建开始,通过触发器的条件触发计算函数的应用,直到水印超过窗口的结束时间加上允许延迟时间后窗口被移除。在这个过程中,窗口可以通过逐出器进一步清理数据。了解窗口的生命周期和组件是有效使用Flink进行流处理的关键。

窗口的创建

  • 当第一个属于某个窗口的元素到达时,该窗口即被创建。窗口的创建依赖于窗口分配器(Window Assigner),它决定了元素如何被分配到不同的窗口中。

窗口的移除

  • 窗口的移除基于时间(事件时间或处理时间)和用户指定的允许延迟时间(Allowed Lateness)。对于基于时间的窗口(如滚动窗口、滑动窗口等),当水印(Watermark)超过了窗口的结束时间加上允许延迟时间时,该窗口将被移除。但需要注意的是,Flink仅确保基于时间的窗口会被移除,对于其他类型的窗口(如全局窗口)则没有这样的保证。

窗口的触发器和函数

  • 每个窗口都会附加一个触发器(Trigger)和一个函数(如ProcessWindowFunction、ReduceFunction或AggregateFunction)。触发器定义了窗口何时准备好执行函数的条件。函数则包含了应用于窗口内容的计算逻辑。
  • 触发器的策略可以基于多种条件,如窗口中的元素数量、水印的位置等。触发器还可以决定在窗口创建和移除之间的任何时间点清除窗口内容(但不清除窗口元数据),这允许在清除后继续向窗口添加新数据。

窗口的逐出器

  • 除了触发器和函数外,还可以指定一个逐出器(Evictor),它在触发器触发后、函数应用前或应用后,从窗口中移除元素。逐出器提供了一种机制来根据特定条件(如元素优先级、时间戳等)清理窗口中的数据。

下一期,我将对ProcessWindowFunction,ReduceFunction,AggregationFunction进行详细地解析。

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值