Flink中的时间和窗口

Flink中的时间和窗口

在传统的批处理系统中,我们可以等到一批数据全部都到齐了之后,对其做相关的计算;但是在实时处理系统中,数据是源源不断的,正常情况下,我们就得来一条处理一条。那么,我们应该如何统计某个实时数据源中最近一段时间内的数据呢?
在Flink的观念中,引入了“窗口”的概念。所谓的“窗口”,一般就是划定的一段时间范围,也就是“时间窗”;对在这范围内的数据进行处理,就是所谓的窗口计算。所以窗口和时间往往是分不开的。

一、窗口(Window)

1.正确的理解窗口

简单来说,Flink是一个流式计算引擎,主要用来处理无界数据流的,数据源源不断、无穷无尽,想要方便高效的处理这种无界数据流,一种方式就是将这种无界数据划分为多个有界的"数据块",这其实就是窗口(Window)。
Flink中的窗口并不是提前创建好了的,而是动态创建的,当有落在这个窗口区间范围 的数据达到时,才创建对应的窗口。另外,这里我们认为到达窗口结束时间时,窗口就触发计算并关闭,事实上“触发计算”和“窗口关闭”两个行为也可以分开。
在这里插入图片描述

2.窗口的分类

1)按照驱动类型分
窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息其实就是“怎样截取数据”。换句话说, 就是以什么标准来开始和结束数据的截取,我们把它叫作窗口的“驱动类型”。
(1)时间窗口(Time Window)
时间窗口以时间点来定义窗口的开始(start)和结束(end),所以截取出的就是某一时间段的数据。到达结束时间时,窗口不再收集数据,触发计算输出结果,并将窗口关闭销毁。
(2)计数窗口(Count Window)
计数窗口基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口。每个窗口截取数据的个数, 就是窗口的大小。
在这里插入图片描述
通过上面的图我们可以看到,时间窗口的时间固定,计数窗口的计数固定。
其实,到这里,我们可以进一步正确的理解窗口,在Flink中,窗口其实并不是一个“框”,它更加像一个“桶”,在Flink中,窗口可以把流切割为有限大小的多个“存储桶”(bucket),流中的每一个数据都会进入到对应的桶中,当窗口的结束时间到达时,就会关闭桶并且对桶中的数据进行收集计算,也就是所谓的窗口计算。
2)按照窗口分配数据的规则分类
根据分配数据的规则,窗口的具体实现可以分为 4 类:滚动窗口(Tumbling Window)、 滑动窗口(Sliding Window)、会话窗口(Session Window),以及全局窗口(Global Window)。
滚动窗口(Tumbling Window)
滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有一个, 就 是 窗 口 的 大 小 ( window size)。比如我们可以定义一个长度为1小时的滚动时间窗口, 那么每个小时就会进行一次统计;或者定义一个长度为10的滚动计数窗口,就会每10个数进行一次统计。
可以看出,滚动窗口的应用非常广泛,它可以对每个时间段的数据做统计计算。
在这里插入图片描述
滑动窗口(Sliding Window)
滑动窗口的大小也是固定的。但是窗口之间并不是首尾相接的,而是可以“错开”一定的位置。 定义滑动窗口的参数有两个:除去窗口大小(window size)之外,还有一个“滑动步长”(window slide), 它其实就代表了窗口计算的频率。窗口在结束时间触发计算输出结果,那么滑动步长就代表了计算频率。
当滑动步长小于窗口大小时,滑动窗口就会出现重叠, 这时数据也可能会被同时分配 到多个窗口中。而具体的个数, 就由窗口大小和滑动步长的比 值(size/slide)来决定。 滚动窗口也可以看作是一 种特殊的滑动窗口——窗口大小等于滑动步长(size = slide)。 滑动窗口适合计算结果更新 频率非常高的场景。
相比滚动窗口而言,滚动窗口可以做每个时间段的计算,滑动窗口就更适合做最近一个时间段的计算。
在这里插入图片描述
会话窗口(Session Window)
会话窗口,是基于“会话”(session)来来对数据进行分组的。会话窗口只能基于时间来定义。 会话窗口中,最重要的参数就是会话的超时时间,也就是两个会话窗口之间的最小距离。如果相邻两个数据到来的时间间隔(Gap)小于指定的大小(size),那说明还在保持会话,它们就属于同一个窗口;如果gap大于size, 那么新来的数据就应该属于新的会话窗口,而前一个窗口就应该关闭了。
会话窗口的长度不固定, 起始和结束时间也是不确定 的,各个分区之间窗口没有 任何关联。会话窗口之间一 定是不会重叠的,而且会留 有至少为size的间隔(session gap)。在一些类似保持会话的场 景下,可以使用会话窗口来进 行数据的处理统计。
在这里插入图片描述
全局窗口(Global Windows)
“全局窗口”,这种窗口全局有效,会把相同key的所有数据都分配到同一个窗口中。这种窗口没有结束的时候, 默认是不会做触发计算的。如果希望它能对数据进行计算处理,还需要自定义“触发器”(Trigger)。
全局窗口没有结束的 时间点,所以一般在希望 做更加灵活的窗口处理时 自定义使用。Flink中的计数窗口(Count Window), 底层就是用全局窗口实现的。
在这里插入图片描述

二、时间语义

在这里插入图片描述
到底是以那种时间作为衡量标准,就是所谓的“时间语义”。
在实际应用中,事件时间语义会更为常见。一般情况下,业务日志数据中都会记录数据生成的时间戳(timestamp),它就可以作为事件时间的判断基础。 在 Flink 中,由于处理时间比较简单,早期版本默认的时间语义是处理时间;而考虑到事件时间在实际应用中更为广泛,从 Flink1.12 版本开始,Flink 已经将事件时间作为默认的时间语义了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数栈帧的创建与销毁(保姆级讲解)

局部变量是怎么创建的? 在为main函数开辟栈帧空间时,在一定范围内初始化成0CCCCC,再把里面0CCCC的一些开辟空间给局部变量使用。 为什么局部变量的值是随机值? 因为我们在为main函数开辟栈帧空间时,会将一定范围内空间初始成0CCCCCC里面…

Avalonia使一个弹窗弹到指定位置

1.项目下载地址&#xff1a;https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia&#xff0c;项目地址 https://github.com/irihitech/Semi.Avalonia 3.样式预览 4.PositionControl.axaml <UserControl xmlns"https://github.com/avaloniaui&quo…

华为数通方向HCIP-DataCom H12-831题库(单选题:201-220)

第201题 如图所示,路由器所有的接口开启OSPF,链路的Cost值如图中标识。若在R2的OSPF进程中通过命令import-route direct type 1引入直连路由,则R1到达10.0.2.2 /32的Cost值是以下哪一选项? A、150 B、151 C、200 D、201 答案:C 解析: Loopback0的cost值默认为0,R1-R2的…

AI 律助 Alpha GPT 线上实操发布会,重磅发布!

数字化时代,随着人工智能的迅猛发展,各行各业都在积极探索通过智能化工具实现工作效率翻升的可能性。“ ChatGPT 类产品”是未来办公应用软件发展的重要趋势之一,但如何将 ChatGPT 真正应用于法律人的工作,赋能效率提升?法律行业同样面临着新的挑战和机遇。 破局的关键是实现技…

DevExpress Reporting中文教程 - 如何在macOS等系统中生成导出报表文档

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 在本文中&#xff0c;我们将讨论如何在.NET MA…

基于Java的二手车交易管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

访问控制列表ACL讲解——想偷偷访问数据,我ACL可不同意

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 梦想从未散场&#xff0c;传奇永不落幕&#xff0c;博主会持续更新优质网络知识、Python知识、Linux知识以及各种小技巧&#xff0c;愿你我共同在CSDN进步 目录 一、ACL的基本概念 1. ACL是什么 2. 为什么需…

从零开始学习 Java:简单易懂的入门指南之线程同步(三十五)

线程同步 1.线程同步1.1卖票【应用】1.2卖票案例的问题1.3同步代码块解决数据安全问题【应用】1.4同步方法解决数据安全问题【应用】1.5Lock锁【应用】1.6死锁 2.生产者消费者2.1生产者和消费者模式概述【应用】2.2生产者和消费者案例【应用】2.3生产者和消费者案例优化【应用】…

C++程序加速方法

C程序加速方法 1. 将反复使用的数据存放在全局变量里面2. 使用多线程3. 用a和a&#xff0c;a–,--a4. 减少除法运算5. 尽量减少值传递&#xff0c;多用引用来传递参数。6. 循环引发的讨论1&#xff08;循环内定义&#xff0c;还是循环外定义对象&#xff09;7. 循环引发的讨论2…

出游热潮再起,IPIDEA代理IP帮你应对旅游数据采集的挑战

随着互联网的快速发展&#xff0c;旅游行业也随之迅速发展。在线旅游预订已经成为人们出行前的必要步骤&#xff0c;然而&#xff0c;旅游信息的采集却是一项具有挑战性的任务。为了从酒店和航空公司网站、在线旅行社和其他类似来源收集数据&#xff0c;企业需要克服许多障碍。…

valarray 包含对象成员的类(cpp14章)

C代码重用 1.公有继承可以实现 2.包含、私有继承、保护继承用于实现has-a关系&#xff0c;即新的类将包含另一个类的对象。 &#xff08;使用这样类成员&#xff1a;本身是另外一个类对象称为包含 &#xff08;组合或层次化&#xff09;。&#xff09; 3.函数模板、类模…

GoLang连接mysql数据库

跟着文档走GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly. 1.使用命令拉取 go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite2.开始使用 package mainimport ("fmt""github.com/gin-gonic/gin"&…

虚幻阴影整理

虚拟阴影贴图&#xff08;VSM&#xff09;是一种全新的阴影贴图方法&#xff0c;可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和反射以及世界分区功能结合使用&#xff0c;它能够实现电影级的品质效果&#xff0c;为大型开放场景提供光照。 …

mysql case when 不命中缓存

case when 在sql 中非常方便数据不同维度统计&#xff0c;但是也会出现mysql 索引不命中问题&#xff0c;当多个case 出现时&#xff0c;需要提取出来到where里面优化 优化后 SELECT date(RecordTime) AS date, count( DISTINCT CASE WHEN Param 1 …

Java之TCP和UDP进行网络编程

目录 一.网络编程 1.1网络编程的作用 1.2网络编程的基本概念 1.3网络编程的实现 二.UDP网络编程 2.1UDP数据报套的初步了解 2.2Java数据报套接字通信模型 2.3Java编程实现UDP通信 三.TCP网络编程 3.1TCP流套接字api 3.2TCP通信代码实现 3.2.1短连接实现代码 3.…

钉钉数字校园小程序开发:开启智慧教育新时代

随着信息技术的快速发展和校园管理的日益复杂化&#xff0c;数字校园已成为现代教育的重要趋势。钉钉数字校园小程序作为一种创新应用&#xff0c;以其专业性、思考深度和逻辑性&#xff0c;为学校提供了全新的管理、教学和沟方式。本文从需求分析、技术实现和应用思考三个方面…

websocket逆向-protobuf序列化与反序列化

系列文章目录 训练地址&#xff1a;https://www.qiulianmao.com 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集实战一&#xff1a;Http轮询更新中 websocket逆向-protobuf序列化与反序列化基础 系…

Apipost连接数据库详解

Apipost提供了数据库连接功能&#xff0c;在接口调试时可以使用数据库获取入参或进行断言校验。目前的Apipost支持&#xff1a;Mysql、SQL Sever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Redis、MongoDB 8种数据库的连接操作 新建数据库连接&#xff1a; 在「项目设置…

【Redis】使用Java客户端操作Redis

目录 引入jedis依赖连接Redis命令get/setexists/delkeysexpire/ttltype 引入jedis依赖 连接Redis 命令 get/set exists/del keys expire/ttl type

C++笔记之获取线程ID以及线程ID的用处

C笔记之获取线程ID以及线程ID的用处 code review! 文章目录 C笔记之获取线程ID以及线程ID的用处一.获取ID二.线程ID的用处2.1.线程池管理2.2.动态资源分配2.3.使用线程同步机制实现互斥访问共享资源2.4.使用线程 ID 辅助线程同步2.5.任务分发&#xff1a;线程ID可以用于将任务…