Flink窗口window详解(分类、生命周期、窗口分配器、窗口函数、触发器)

一、窗口的分类

时间窗口:滚动(窗口大小)、滑动(窗口大小、滑动步长)、会话(会话超时时间)

计数窗口:滚动、滑动

二、窗口window的四个关键组件

窗口操作一般在keyby之后调用window函数进行计算,因为进行keyby之后,原始的datastream就会分成多条逻辑流,就是keyedStream,基于keyedStream的窗口操作会开启多个并行子任务,即对不同的key分别开启一个并行子任务,各自独立进行窗口计算。

如果没有keyBy而直接进行窗口计算,调用的是windowAll函数,windowAll函数本身是一个非并行的操作,那么即使手动调大了窗口算子并行度也是无济于事的,最终只会在一个task上进行计算,并行度为1。在实际应用中不推荐。

(1)(必要)窗口分配器(window assigner)

定义数据应该被分配到哪个窗口,数据流经过窗口分配器处理后得到的是windowedStream,这个类型并不是datastream, 所以不能直接进行其他转换,必须进一步调用窗口函数,才能再次得到datastream。

时间窗口根据分类可以通过在window方法中传入不同参数定义如下六种窗口分配器:TumblingProcessingTimeWindows、SlidingProcessingTimeWindows、ProcessingTimeSessionWindows、TumblingEventTimeWindows、SlidingEventTimeWindows、EventTimeSessionWindows。

计数窗口直接调用.countWindow()方法,传入一个参数则是滚动,两个则是滑动计数窗口。

(2)(必要)窗口函数(window functions)

定义窗口数据的具体计算逻辑。原**始的datastream经过窗口分配器处理之后的数据类型时windowedStream,它不属于dataStream,需要进一步调用窗口函数才能变成dataStream。**窗口函数基于处理方式的不同,可以分为如下两种:

增量聚合函数(流处理思想) :来一条数据处理一条,但不立即输出计算结果,等窗口到了结束时间需要计算结果的时候,直接将之前的聚合状态输出,提高了程序运行效率和实时性

典型的增量聚合函数有两种:归约函数.reduce((new ReduceFunction))和聚合函数.aggrerate(new AggregateFuntion)。归约函数要求聚合结果类型与原始数据类型一致,适用面更窄。聚合函数可以自定义中间状态累加器,更符合Flink的有状态的流处理思想。

全窗口函数(批处理思想): 先收集窗口中的数据并缓存起来,等到窗口要输出计算结果时再取出全部数据进行计算。全窗口函数再有些场合十分有用 :如要计算分位数,则必须等所有数据到齐才能进行计算。此外,全窗口函数还能输出丰富的上下文信息(如窗口的起始时间)。

在Flink中,全窗口函数可以通过.process(new **ProcessWindowFunction)**来实现。

(3)(可选)触发器(Trigger)

触发器可以控制窗口函数的执行。试想这样一种情况:你要计算一台能的pv,你的窗口大小是一天(0点到24点),但你想要在中间的每一个整点时刻也能看到从当天0点累计到当前整点的pv(0-1,0-2,0-3...),那么就可以使用触发器,在每个整点也触发一次计算并输出计算结果。

对windowedStream类型的数据流调用.trigger()方法,就可以传入一个自定义触发器了。这里就不详述trigger的具体实现了,感兴趣的可以自己查看。

(4)(可选)退出器(Evictor)

在执行窗口函数之前或之后的移除数据的逻辑操作。对windowedStream调用.evictor()方法。

三、窗口的生命周期

(1)窗口的创建

窗口的类型和基本信息由窗口分配器(window assigners)指定,但窗口不会预先创建好,而是数据驱动创建的。当属于这个窗口的第一个元素到来时,就会创建对应的窗口。

(2)窗口计算的触发

窗口函数和触发器都能触发窗口的计算。窗口函数定义了窗口计算的逻辑,触发器则指定了调用窗口函数的条件。

(3)窗口的销毁

默认情况下,当水位线到达了窗口的结束时间,就会触发计算并销毁窗口。当设置了允许迟到数据后,水位线到达窗口的结束时间会触发计算,但窗口不会立即销毁,而是在(窗口结束时间+设置的允许等待的时间)的水位线到来才会销毁窗口。

相关推荐
TDengine (老段)10 分钟前
通过云服务 快速体验 TDengine
大数据·数据库·物联网·时序数据库·tdengine·涛思数据·iotdb
硅基流动35 分钟前
从云原生到 AI 的跃迁探索之路|开发者说
大数据·人工智能·云原生
星辰_mya38 分钟前
Elasticsearch——待补充
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 小时前
Elasticsearch:使用 Elastic Workflows 构建自动化
大数据·数据库·人工智能·elasticsearch·搜索引擎·自动化·全文检索
跨境卫士-小汪1 小时前
选品更稳的新打法:用“用户决策阻力”挑品——阻力越大,越有机会做出溢价
大数据·人工智能·产品运营·跨境电商·内容营销·跨境
迎仔2 小时前
11-NoSQL数据库HBase介绍:大数据世界的“快速检索图书馆”
大数据·nosql·hbase
迎仔2 小时前
01-Hadoop 核心三剑客通俗指南:从“单机搬砖”到“包工队”
大数据·hadoop·分布式
Elastic 中国社区官方博客2 小时前
Elastic 9.3:与数据对话、构建自定义 AI agents、实现全自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
双层吉士憨包2 小时前
乐天Rakuten开店:乐天Rakuten跨境店VS本土店?2026实战攻略
大数据
档案宝档案管理2 小时前
企业档案管理系统:从“资料存放”到“数据资产”的升级
大数据·人工智能·档案·档案管理