首页 > 其他分享 >[实时流基础 flink] 窗口

[实时流基础 flink] 窗口

时间:2024-04-01 21:30:28浏览次数:20  
标签:... 窗口 10 flink 实时 会话 Window 数据

在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一条就得处理一条,那么我们怎么统计最近一段时间内的数据呢?引入“窗口”。


文章目录

尚硅谷flink的学习笔记

所谓的“窗口”,一般就是划定的一段时间范围,也就是“时间窗”;对在这范围内的数据进行处理,就是所谓的窗口计算。所以窗口和时间往往是分不开的。

6.1 窗口的概念

Flink是一种流式计算引擎,主要是来处理无界数据流的,数据源源不断、无穷无尽。想要更加方便高效地处理无界流,一种方式就是将无限数据切割成有限的“数据块”进行处理,这就是所谓的“窗口”(Window)。
image.png
**注意:**Flink中窗口并不是静态准备好的,而是动态创建——当有落在这个窗口区间范围的数据达到时,才创建对应的窗口。另外,这里我们认为到达窗口结束时间时,窗口就触发计算并关闭,事实上“触发计算”和“窗口关闭”两个行为也可以分开。

6.2 窗口的分类

1)按照驱动类型分

窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息其实就是“怎样截取数据”。换句话说,就是以什么标准来开始和结束数据的截取,我们把它叫作窗口的“驱动类型”。
image.png

(1)时间窗口(Time Window)

时间窗口以时间点来定义窗口的开始(start)和结束(end),所以截取出的就是某一时间段的数据。到达结束时间时,窗口不再收集数据,触发计算输出结果,并将窗口关闭销毁。所以可以说基本思路就是“定点发车”

(2)计数窗口(Count Window)

计数窗口基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口。每个窗口截取数据的个数,就是窗口的大小。基本思路是“人齐发车”。

2)按照窗口分配数据的规则分类

根据分配数据的规则,窗口的具体实现可以分为4类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)、会话窗口(Session Window),以及全局窗口(Global Window)。

(1)滚动窗口(Tumbling Windows)

滚动窗口有固定的大小,是一种对数据进行“均匀切片”的划分方式。窗口之间没有重叠,也不会有间隔,是“首尾相接”的状态。这是最简单的窗口形式,每个数据都会被分配到一个窗口,而且只会属于一个窗口。
滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有一个,就是窗口的大小(window size)。比如我们可以定义一个长度为1小时的滚动时间窗口,那么每个小时就会进行一次统计;或者定义一个长度为10的滚动计数窗口,就会每10个数进行一次统计。
image.png

滚动窗口应用非常广泛,它可以对每个时间段做聚合统计,很多BI分析指标都可以用它来实现。

(2)滑动窗口(Sliding Windows)

当滑动步长小于窗口大小时,滑动窗口就会出现重叠,这时数据也可能会被同时分配到多个窗口中。而具体的个数,就由窗口大小和滑动步长的比值(size/slide)来决定。
滚动窗口也可以看作是一种特殊的滑动窗口——窗口大小等于滑动步长(size = slide)。
image.png

滑动窗口适合计算结果更新频率非常高的场景

(3)会话窗口(Session Windows)

会话窗口,是基于“会话”(session)来来对数据进行分组的。会话窗口只能基于时间来定义。

会话窗口中,最重要的参数就是会话的超时时间,也就是两个会话窗口之间的最小距离。如果相邻两个数据到来的时间间隔(Gap)小于指定的大小(size),那说明还在保持会话,它们就属于同一个窗口;如果gap大于size,那么新来的数据就应该属于新的会话窗口,而前一个窗口就应该关闭了。
image.png

在一些类似保持会话的场景下,可以使用会话窗口来进行数据的处理统计。

(4)全局窗口(Global Windows)

“全局窗口”,这种窗口全局有效,会把相同key的所有数据都分配到同一个窗口中。这种窗口没有结束的时候,默认是不会做触发计算的。如果希望它能对数据进行计算处理,还需要自定义“触发器”(Trigger)。

全局窗口没有结束的时间点,所以一般在希望做更加灵活的窗口处理时自定义使用。Flink中的计数窗口(Count Window),底层就是用全局窗口实现的。

** 6.3 窗口API概览**

1)按键分区(Keyed)和非按键分区(Non-Keyed)

如果没有进行keyBy,那么原始的DataStream就不会分成多条逻辑流。这时窗口逻辑只能在一个任务(task)上执行,就相当于并行度变成了1。

stream.keyBy(...)
       .window(...)


stream.windowAll(...)
2)代码中窗口API的调用

窗口操作主要有两个部分:窗口分配器 (Window Assigners) 和窗口函数 (Window Functions)

stream.keyBy(<key selector>)
       .window(<window assigner>)
       .aggregate(<window function>)

6.4 窗口分配器

定义窗口分配器(Window Assigners)是构建窗口算子的第一步,它的作用就是定义数据应该被“分配”到哪个窗口。所以可以说,窗口分配器其实就是在指定窗口的类型。

窗口分配器最通用的定义方式,就是调用.window()方法。这个方法需要传入一个WindowAssigner作为参数,返回WindowedStream。如果是非按键分区窗口,那么直接调用.windowAll()方法,同样传入一个WindowAssigner,返回的是AllWindowedStream。
窗口按照驱动类型可以分成时间窗口和计数窗口,而按照具体的分配规则,又有滚动窗口、滑动窗口、会话窗口、全局窗口四种。除去需要自定义的全局窗口外,其他常用的类型Flink中都给出了内置的分配器实现,我们可以方便地调用实现各种需求。

时间窗口
// 滚动处理时间窗口
stream.keyBy(...)
       .window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
       .aggregate(...)
// 滑动处理时间窗口
stream.keyBy(...)
       .window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(5)))
       .aggregate(...)
// 绘画时间窗口 
// .withGap()方法需要传入一个Time类型的参数size,表示会话的超时时间,
// 也就是最小间隔session gap。我们这里创建了静态会话超时时间为10秒的会话窗口。
stream.keyBy(...)
       .window(ProcessingTimeSessionWindows.withGap(Time.seconds(10)))
       .aggregate(...)
计数窗口
// 我们定义了一个长度为10的滚动计数窗口,当窗口中元素数量达到10的时候,就会触发计算执行并关闭窗口。
stream.keyBy(...)
       .countWindow(10)

// 我们定义了一个长度为10、滑动步长为3的滑动计数窗口。
// 每个窗口统计10个数据,每隔3个数据就统计输出一次结果。
stream.keyBy(...)
       .countWindow(10,3)

标签:...,窗口,10,flink,实时,会话,Window,数据
From: https://blog.csdn.net/qq_45704048/article/details/137247278

相关文章

  • [实时流基础 flink] 窗口函数
    尚硅谷学习笔记6.5窗口函数增量聚合函数(ReduceFunction/AggregateFunction)窗口将数据收集起来,最基本的处理操作当然就是进行聚合。我们可以每来一个数据就在之前结果上聚合一次,这就是“增量聚合”。典型的增量聚合函数有两个:ReduceFunction和AggregateFunction。......
  • 云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
    方案概述现在绝大多数客户都有很多非结构化的数据存在OSS中,以图片,视频,音频居多。举一个图片处理的场景,现在各种终端种类繁多,不同的终端对图片的格式、分辨率要求也不同,所以一张图片往往会有很多张衍生图,那如果所有的衍生图都存在OSS中,那存储的成本会增加,所以就可以通过OSSO......
  • 239. 滑动窗口最大值(困难)
    核心思想主要包含两个动作nums[i]进和nums[i-k]出新元素进入窗口旧元素移出窗口最大值是谁这个区间各个元素都有可能所以用一个set记录窗口的值,自定义排序从大到小,每次拿第一个就是最大值同时用map记录数字出现次数,为0则移出set。代码classSolution{publicin......
  • iOS移动应用实时查看运行日志的最佳实践
    目录一、设备连接二、使用克魔助手查看日志三、过滤我们自己App的日志......
  • iOS开发者必备的实时查看应用程序运行日志技术
    目录一、设备连接二、使用克魔助手查看日志三、过滤我们自己App的日志......
  • iOS应用程序中实时查看日志的效率优化技巧
    目录一、设备连接二、使用克魔助手查看日志三、过滤我们自己App的日志......
  • 13天【代码随想录算法训练营34期】 第五章 栈与队列part03(● 239. 滑动窗口最大值 ●
    239.滑动窗口最大值单调队列:单调递减,一个queue,最大值在queue口,队列中只维护有可能为最大值的数字比如说1,3,2,4;当slidingwindow已经到3时,就可以把1pop出去了,因为有了3,1不可能为最大值,同理到4的时候,3、2都可以pop出去classMyQueue:def__init__(self):self.queue......
  • 使用React 18和WebSocket构建实时通信功能
    1.引言WebSocket是一种在Web应用中实现双向通信的协议。它允许服务器主动向客户端推送数据,而不需要客户端发起请求。在现代的实时应用中,WebSocket经常用于实时数据传输、聊天功能、实时通知和多人协作等场景。在本篇博客中,我们将探索如何在React18应用中使用WebSocket来......
  • PyQt:【重磅干货】实现一个自定义样式的窗口(比如去掉边框、改变标题位置、窗口按钮样式
    如果想突破PyQt自带窗口的样式限制,比如同时去掉窗口的边框、改变边框、改变标题位置、窗口控制按钮等等,那就需要实现一个自定义样式的窗口,本文教你如何实现先来看看PyQt创建窗口的默认样式:再看看一个自定义样式的窗口:可以看到,这里示例的自定义窗口去掉了窗口的边框、改......
  • 大数据模型、离线架构、实时架构 有用 各种架构图及优点
    一.大数据模型8种常见的大数据分析模型:1、留存分析模型;2、漏斗分析模型;3、全行为路径分析;4、热图分析模型;5、事件分析模型;6、用户分群模型;7、用户分析模型;8、黏性分析模型。1、留存分析模型留存分析模型是一种用来分析用户参与情况/活跃程度的分析模型,考察进行初始行为的用户中......