Flink之水印(watermark)的补充理解
水印(Watermark):用于事件时间处理,标记数据流的进度,解决乱序和延迟问题,触发窗口计算
一、Flink 水印的作用
- 处理乱序事件
水印(Watermark)是 Flink 用于处理事件时间(Event Time)乱序数据的核心机制。水印表示“在该时间戳之前的数据已全部到达”,允许系统在不确定数据顺序的情况下推进计算进度。 - 触发窗口计算
当水印时间超过窗口的结束时间时,触发窗口计算并关闭窗口,确保窗口内的数据完整性。 - 容忍数据延迟
通过设置允许延迟时间(如 BoundedOutOfOrderness),水印可等待一定范围内的迟到数据,避免因短暂乱序导致数据丢失。
二、水印判定数据迟到的逻辑
水印通过以下机制判定迟到数据:
- 基准定义
- 水印时间T表示事件时间≤T的数据应已到达系统。
- 任何事件时间≤T但晚于水印到达的数据视为迟到。
- 窗口触发与迟到处理
- 窗口触发条件:水印时间 ≥ 窗口结束时间。
- 窗口关闭后,事件时间属于该窗口的数据将被丢弃或通过侧输出(Side Output)处理。
- 允许延迟(Allowed Lateness):窗口可额外等待一段时间(如3秒),延迟期内到达的数据仍可被处理。
策略选择原则:根据数据乱序程度选择固定延迟或单调递增策略,极端乱序场景需结合侧输出(Side Output)处理异常事件。
高乱序场景优先采用事件时间窗口+水印机制。
三、水印的初次生成原理
1. 初始触发条件
水印的初次生成依赖于第一条到达的事件数据。系统提取其事件时间戳,结合允许延迟时间计算初始水印。
- 公式:
初始水印时间 = 第一条数据的事件时间 - 允许延迟时间
- 示例:若第一条数据的事件时间为
10:00
,允许延迟为5分钟
,则初始水印为09:55
。
2. 动态更新机制
后续水印根据新到达数据的事件时间动态更新,始终以当前最大事件时间为基准。
四、水印的生成策略
- 固定延迟策略(BoundedOutOfOrderness)
显式指定允许的最大延迟时间,适用于数据存在可控乱序的场景。
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofMinutes(5))
该策略生成的水印时间 = 当前最大事件时间 - 允许延迟时间。
- 单调递增策略(forMonotonousTimestamps)
假设数据严格有序,允许延迟时间设为 0,水印时间等于当前最大事件时间。适用于数据源本身有序的场景。
- 自定义生成策略
通过实现 WatermarkGenerator 接口,根据业务逻辑动态调整水印生成规则(如根据事件特征或外部系统状态)。
五、数据乱序时事件时间窗口 vs. 处理时间窗口
对比维度 | 基于事件时间的窗口 | 基于处理时间的窗口 |
---|---|---|
时间基准 | 数据自带的事件时间戳 | 系统处理时间(无需水印) |
水印作用 | 解决乱序问题,动态控制窗口关闭时机 | 无关联,窗口直接按系统时间划分 |
乱序处理能力 | 通过水印延迟窗口关闭,允许迟到数据进入窗口 | 无法处理乱序,窗口按固定时间触发 |
典型配置 | 需指定 TimestampAssigner 和 WatermarkStrategy | 仅需定义窗口大小和滑动间隔 |
核心差异说明
- 事件时间窗口:依赖水印动态调整窗口关闭时间,水印生成与数据事件时间强相关。例如,若数据时间戳跳跃式增长,水印会快速推进,可能导致中间窗口提前关闭。
- 处理时间窗口:完全基于系统时钟,窗口触发与数据实际到达顺序无关,无法感知事件时间的乱序问题。
六、风险对系统的影响及应对策略
1. 潜在风险
- 窗口提前关闭:若事件时间突然大幅推进(如从10:00跳跃到12:00),可能导致中间窗口(如10:00-11:00)因水印跨越而提前关闭,后续数据无法进入这些窗口。
- 数据倾斜:时间戳异常事件可能导致水印频繁推进,增加窗口计算频率和资源消耗。
2. 优化配置
- 限制水印推进速度:通过BoundedOutOfOrderness策略设置最大允许延迟时间,避免因偶发大时间戳事件导致水印异常推进。
示例代码:
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofMinutes(5))
- 侧输出异常事件:对时间戳显著偏离当前窗口范围的事件,通过侧输出(Side Output)单独处理
示例:
OutputTag<Event> anomalousTag = new OutputTag<>("anomalous"){};
stream.process(new ProcessFunction<Event, Event>() {@Overridepublic void processElement(Event event, Context ctx, Collector<Event> out) {if (event.getTimestamp() > ctx.timerService().currentWatermark() + MAX_SKEW) {ctx.output(anomalousTag, event);} else {out.collect(event);}}
});
七、典型场景示例
假如第一个事件事件是10:00,基于事件时间滚动窗口为5分钟,
那么第一个窗口范围是多少?
如果允许迟到2分钟,第一个水印时间是多少?
触动第一个窗口关闭的水印时间是多少?
那么10:06的事件会被分到第几个窗口呢?
第一个窗口范围
当第一个事件的事件时间为 10:00,基于事件时间的滚动窗口为5分钟时,第一个窗口的范围是 [10:00, 10:05),第二个窗口:[10:05, 10:10),以此类推。
滚动窗口将事件时间划分为固定长度且不重叠的区间,每个窗口的起始时间为事件时间的整数倍12。例如,事件时间 10:00 会被分配到 10:00-10:05 的窗口。
允许迟到2分钟时的第一个水印时间
若允许迟到时间为2分钟,第一个水印时间为 9:58。
水印时间计算公式为:水印时间 = 当前最大事件时间 - 允许延迟时间。
当第一个事件到达时,当前最大事件时间为 10:00,允许延迟为2分钟,因此水印初始值为 10:00 - 2分钟 = 9:58。
触发第一个窗口关闭的水印时间
触发第一个窗口关闭的水印时间为 10:07。
窗口关闭条件:当水印时间超过窗口结束时间(10:05)时,窗口关闭并触发计算。
允许迟到2分钟时,窗口会在原结束时间基础上额外等待2分钟。因此,实际触发关闭的水印时间为 10:05 + 2分钟 = 10:07。
事件时间 10:06 的窗口分配
- 当事件时间为 10:06 时,基于事件时间的滚动窗口(窗口大小5分钟),事件时间 10:06 落在 10:05 ≤ 时间戳 < 10:10 区间内,因此会将其分配到 第二个窗口,即窗口范围为 [10:05, 10:10)。
- 允许迟到时间(如2分钟)仅影响窗口关闭的触发时机(窗口会在原结束时间后等待2分钟),不改变事件所属窗口的分配逻辑。例如:
- 窗口 [10:00, 10:05) 的关闭水印时间为 10:07(原结束时间 10:05 + 允许迟到2分钟)。
- 事件时间 10:06 即使迟到,仍属于窗口 [10:05, 10:10),与允许迟到时间无关。
相关文章:
Flink之水印(watermark)的补充理解
水印(Watermark):用于事件时间处理,标记数据流的进度,解决乱序和延迟问题,触发窗口计算 一、Flink 水印的作用 处理乱序事件 水印(Watermark)是 Flink 用于处理事件时间&…...
数据结构全解析:从线性到非线性,优缺点与应用场景深度剖析
1. 线性数据结构 (1)数组(Array)(适合静态数据) 优点: 随机访问高效:通过索引可以直接访问元素,时间复杂度为 O(1)。 内存连续:数组在内存中是连续存储的&…...
《使用 Python Flask + MySQL + ECharts 构建销售数据看板》实战案例笔记
《使用 Python Flask + MySQL + ECharts 构建销售数据看板》实战案例笔记 技术栈说明 后端:Python 3.10 + Flask 框架数据库:MySQL前端:ECharts 5.4 + HTML/CSS数据可视化:柱状图 / 折线图 / 饼图 / 雷达图项目结构 project/ ├── server.py # 后端服务 └──…...
StringBuilder和StringJoiner的运用
package test12; import java.util.Scanner; import java.util.StringJoiner;public class Test { public static void main(String[] args) {/* String str "你玩的真好,下次别玩了,TMD,CNM";String[] arr {"TMD", &…...
科技创新:改变生活的力量与未来趋势
人工智能在智能客服中的应用越来越普遍。它改变了传统的客服模式。AI可以快速回答用户的问题,提高了客服效率和服务质量。 首先,人工智能能够处理大量信息。智能客服可以在几秒钟内回应客户的请求。这比人工客服快得多。客户不需要等待很久就能得到答案…...

Maven指定JDK
在使用 Maven 管理 Java 项目时,有时需要指定使用特定的 JDK 版本。这通常是因为项目需要与特定版本的 JDK 兼容,或者在不同的开发环境中需要确保使用正确的 JDK 版本。通常来说在IDEA工具中设置了正确的JDK版本,使用IDEA编译也不会有任何异常…...

Jenkins持续集成与Web前端、SpringBoot项目的部署
Jenkins是一个开源的持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)工具,广泛应用于软件开发过程中。它基于Java开发,旨在提供一个开放易用的软件平台,帮助软件项…...

如何使用Opentelemetry+jaeger对Go与Java项目实现分布式链路追踪
本文介绍![如何使用Opentelemetryjaeger实现分布式链路追踪] 关于opentelemetry的介绍可以看下面的文章 https://blog.csdn.net/qq_62368250/article/details/143516314本文中相关图片以及源代码地址 https://github.com/wuchenyanghaoshuai/others/blob/main/step39/README.…...

LabVIEW闭环控制系统硬件选型与实时性能
在LabVIEW闭环控制系统的开发中,硬件选型直接影响系统的实时性、精度与稳定性。需综合考虑数据采集速度(采样率、接口带宽)、计算延迟(算法复杂度、处理器性能)、输出响应时间(执行器延迟、控制周期&#x…...
Html5学习教程,从入门到精通, HTML5超链接应用的详细语法知识点和案例代码(18)
HTML5超链接应用的详细语法知识点和案例代码 超链接(Hyperlink),也称为跃点链接,是互联网和文档编辑中的一种重要概念。 超链接的定义 超链接是指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页&#…...

STM32 HAL库 CAN过滤器配置
之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法,当时由于并没有使用过滤器的现实需求,所以就也没仔细研究。现在工作中确实需要用到过滤器了,有些项目中控制器和发动机E…...
【前端面试题】Vu3常见的面试题
1.Vue3与 Vue2的核心区别有哪些? 响应式系统 : Vue2:通过Object.defineProperty 实现响应式。这种方式在处理对象属性的添加和删除时存在局限性,且无法直接监控数组的变化 ;Vue3:采用Proxy 实现响应式&…...

【数据分享】2001-2024年我国逐年植被净初级生产力(NPP)数据
植被净初级生产力(Net Primary Productivity,NPP)是生态学中的一个重要概念,表示单位面积植被在特定时间内吸收的净光合有机物,是衡量生态系统中植物通过光合作用所产生的有机物质减去植物呼吸作用消耗的有机物质的量&…...
java-正则表达式
一、正则表达式能干什么? ✅ 验证格式:手机号、邮箱、日期✅ 提取数据:从日志/文本中抓取关键信息✅ 替换文本:批量修改字符串内容 二、Java正则核心API Java中用 java.util.regex 包的两个类: Pattern:…...
正则表达式(复习)
文章目录 一、[]: 一个字符集合二、{}: 重复次数三、特殊符号四、(): 分组五、python代码示例六、注意 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个…...

sonarqube+SonarScanner+postpresql+jenkins
本地执行参考这篇 sonarqubeSonarScannerPostgreSQL实现代码质量扫描(windows)_sonarqube 10.7部署-CSDN博客 集成到Jenkins中操作如下 在 Jenkins 中安装 SonarQube Scanner 和配置 Job 1、安装 SonarQube Scanner 插件: 在 Jenkins 的管理…...
牛客周赛Round 84
本场比赛难度不大,也是本人第一次AK,最后一题用组合数学推公式,本篇博客主要讲解最后一题的思路 G-小红的陡峭值(五)(hard)_牛客周赛 Round 84 思路:本题要我们求p/q mod M ,即p*&am…...

TDengine 配置 ODBC 数据源
简介 TDengine ODBC 是为 TDengine 实现的 ODBC 驱动程序,支持 Windows 系统的应用(如 PowerBI 等)以及用户自定义开发的应用程序,通过 ODBC 标准接口访问本地、远程和云服务的 TDengine 数据库。 TDengine ODBC 提供基于 WebSo…...
numpy常用函数详解
在深度神经网络代码中经常用到numpy库的一些函数,很多看过之后很容易忘记,本文对经常使用的函数进行归纳总结。 np.arange arange是numpy一个常用的函数,该函数主要用于创建等差数列。它的使用方法如下所示: numpy.arange([star…...

deepseek 3FS编译
3FS在ubuntu22.04下的编译(记录下编译过程,方便后续使用) 环境信息 OS ubuntu 22.04内核版本 6.8.0-52-genericlibfuse 3.16.1rust 1.75.0FoundationDB 7.1.66meson 1.0.0ninja 1.10.1 libfuse编译 以下建议均在root下执行 pip3 install…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...