当前位置: 首页 > article >正文

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)窗口的销毁

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


http://www.kler.cn/a/459355.html

相关文章:

  • ETCD渗透利用指南
  • 服务器迁移中心——“工作组迁移”使用指南
  • ‘元素.style.样式名‘获取不到样式,应该使用Window.getComputedStyle()获取正真的样式
  • 深入浅出 Beam Search:自然语言处理中的高效搜索利器
  • Redis面试相关
  • w~多模态~合集1
  • Flume的概念和原理
  • 【大语言模型】DeepSeek与Kimi对论文内容理解的简单对比
  • 北京人形机器人产业发展与CES Asia 2025的科技展望
  • gozero项目接入elk的配置与实战
  • 如何绘制星巴克门店热力地图
  • 胡闹厨房练习(三)
  • UE5材质节点SimpleGrassWind
  • 《艺术的启示》最新答案2024
  • 前端(Ajax)
  • 日本东京阿里云200M不限流量轻量云主机测试报告
  • 如何利用云计算进行灾难恢复?
  • 发表文章去哪里投稿?软文推广常见的几种渠道类型
  • NAT 技术如何解决 IP 地址短缺问题?
  • 【项目日记(9)】项目整体测试,优化以及缺陷分析
  • 计算机网络 (15)宽带接入技术
  • 基于Python实现车辆检测、机动车检测、识别位置标记、计数
  • STM32-笔记22-sg90舵机
  • 雷军:科技传奇的逐梦之旅
  • ArrayList和LinkedList的区别是什么?
  • 支持最新 mysql9的workbench8.0.39 中文汉化教程来了