Flink 的水印机制

Apache Flink 的 水印机制(Watermark Mechanism) 主要用于解决 事件时间流中的乱序问题(Out-of-Order Events),确保窗口(Window)能够在合适的时间触发计算,从而提供准确、一致的处理结果。


🧩 一、Flink 水印机制解决了什么问题?

✅ 1. 乱序事件无法确定窗口关闭时机

❓ 问题:

在实际数据流中,事件可能由于网络延迟、系统处理差异等原因,并不是按照其“发生时间”顺序到达。例如:

事件时间序列:[3s, 2s, 5s, 4s, 7s]

如果不做处理,窗口可能会错误地提前关闭,导致丢失部分数据。

✅ 解决方案:

使用 水印机制 告诉 Flink:“当前不会再出现比这个时间更早的数据了”,这样 Flink 才能安全地关闭窗口并进行聚合计算。


✅ 2. 保证基于事件时间的窗口语义正确性

Flink 支持多种时间语义(Processing Time、Event Time),只有 Event Time + Watermark 能够提供 精确、可重复、一致性高的结果

💡 使用 Processing Time 窗口无法容忍延迟或乱序,每次运行结果可能不同。


✅ 3. 控制迟到数据的处理方式

通过设置允许的最大延迟 .allowedLateness() 和输出侧边流 .sideOutputLateData(),可以灵活控制哪些数据仍可被处理,哪些应被丢弃或单独处理。


⚙️ 二、水印时间应该如何设置?

水印时间本质上是一个逻辑时间戳,表示“目前不会再有比这个时间更早的事件”。它是由你定义的策略生成的。

📌 设置方式:

DataStream<Event> watermarkedStream = stream.assignTimestampsAndWatermarks(WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);

📈 三、水印设置策略与建议

水印策略适用场景示例代码
forMonotonousTimestamps()数据严格有序,无乱序.forMonotonousTimestamps()
forBoundedOutOfOrderness(Duration max)允许固定最大延迟的乱序.forBoundedOutOfOrderness(Duration.ofSeconds(5))
自定义 WatermarkGenerator特殊业务需求(如动态延迟)实现接口 WatermarkGenerator

🔧 四、如何选择水印时间参数?

✅ 1. 根据数据源特性设置最大乱序时间(maxOutOfOrderness)

  • 如果你的数据源来自 Kafka 或 IoT 设备,需根据历史数据分析最大延迟。
  • 若不了解延迟情况,可先设为 Duration.ofSeconds(5),观察是否仍有迟到数据。

✅ 2. 配合窗口大小合理设置

  • 如果你使用的是 10 秒滚动窗口,设置最大乱序为 5 秒是合理的。
  • 不建议将乱序时间设置得过大,否则会导致窗口迟迟不触发,影响实时性。

✅ 3. 使用 allowedLateness() 控制迟到容忍度

.window(TumblingEventTimeWindows.of(Time.seconds(10)))
.allowedLateness(Time.minutes(1)) // 容忍最多1分钟迟到
.sideOutputLateData(lateTag)      // 输出迟到数据到侧边流

📊 五、示例:如何设置合理的水印时间?

假设你有一个日志系统,事件从客户端发送到服务端,平均延迟 2 秒,最大不超过 5 秒。

推荐配置:

WatermarkStrategy<Event> strategy = WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)) // 最大乱序5秒.withTimestampAssigner((event, timestamp) -> event.getTimestamp());DataStream<Event> watermarkedStream = stream.assignTimestampsAndWatermarks(strategy);// 设置10秒窗口,允许最多1分钟迟到数据
watermarkedStream.keyBy(keySelector).window(TumblingEventTimeWindows.of(Time.seconds(10))).allowedLateness(Time.minutes(1)).process(new MyProcessWindowFunction());

✅ 六、总结

问题解决方法
乱序数据导致窗口计算不完整使用水印机制,设定最大乱序时间
窗口迟迟不触发检查水印是否推进、调整乱序容忍度
迟到数据丢失使用 allowedLateness() + sideOutputLateData() 处理
时间戳未提取使用 withTimestampAssigner() 提取事件时间

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

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

相关文章

【每天一个知识点】embedding与representation

“Embedding&#xff08;嵌入&#xff09;”与“Representation&#xff08;表示&#xff09;”在机器学习、自然语言处理&#xff08;NLP&#xff09;、图神经网络等领域常被使用&#xff0c;它们密切相关&#xff0c;但语义上有一定区别。 一、定义 1. Representation&#…

SpringBoot(二)--- SpringBoot基础(http协议、分层解耦)

目录 前言 一、SpringBoot入门 1.入门程序 2.解析 二、HTTP协议 1.HTTP概述 2.HTTP请求协议 2.1 GET方式的请求协议 2.2 POST方式的请求协议 2.3 两者的区别 2.4 获取请求数据 3.HTTP响应协议 三、分层解耦 1.三层架构 2.IOC&DI 2.1 入门 2.2 IOC详解 2.…

Please install it with pip install onnxruntime

无论怎么安装都是 Please install it with pip install onnxruntime 我python 版本是3.11 &#xff0c;我换成3.10 解决了

【数据结构入门训练DAY-35】棋盘问题

本次训练聚焦于使用深度优先搜索&#xff08;DFS&#xff09;算法解决棋盘上的棋子摆放问题。题目要求在一个可能不规则的nn棋盘上摆放k个棋子&#xff0c;且任意两个棋子不能位于同一行或同一列。输入包括棋盘大小n和棋子数k&#xff0c;以及棋盘的形状&#xff08;用#表示可放…

【日常笔记】wps如何将值转换成东西南北等风向汉字

在WPS表格中&#xff0c;若要将数值&#xff08;如角度值&#xff09;转换成“东、南、西、北”等风向汉字&#xff0c;可通过以下步骤结合自定义函数或条件判断实现&#xff1a; 一、wps如何将值转换 方法一&#xff1a;使用LOOKUP函数&#xff08;简化公式&#xff09;&…

Web性能优化的未来:边缘计算、AI与新型渲染架构

一、边缘计算与性能优化深度整合 1.1 边缘节点计算卸载策略 • 智能任务分割:将非关键路径计算卸载到边缘节点 // 客户端代码 const edgeTask = new EdgeTask(image-processing); edgeTask.postMessage(imageData, {transfer

spring中的EnvironmentPostProcessor接口详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 EnvironmentPostProcessor 是 Spring Boot 提供的一个关键扩展接口&#xff0c;允许开发者在 Spring 应用环境初始化后、应用上下文创建前&…

Vue3知识点梳理

注&#xff1a;纯手打&#xff0c;如有错误欢迎评论区交流&#xff01; 转载请注明出处&#xff1a;https://blog.csdn.net/testleaf/article/details/148056625 编写此文是为了更好地学习前端知识&#xff0c;如果损害了有关人的利益&#xff0c;请联系删除&#xff01; 本文章…

C++23 新增的查找算法详解:ranges::find_last 系列函数

文章目录 引言C Ranges 库简介ranges::find_last、ranges::find_last_if 和 ranges::find_last_if_not 概述ranges::find_last示例代码代码解释 ranges::find_last_if函数签名参数解释示例代码代码解释 ranges::find_last_if_not示例代码代码解释 使用场景总结 引言 在 C 的发…

DW_DMAC简介

基本概念&#xff1a; DMA&#xff1a;全称direct memory access&#xff0c;即直接存储器访问。dma可以在中央处理器CPU不参与的情况下&#xff0c;实现外设和内存之间的数据直接传输&#xff0c;从而提高数据传输效率 外设与计算机内存之间的数据传输&#xff0c;一般可通过…

信号量基础入门:并发控制的核心概念

问题的复杂性产生的根本原因在于&#xff0c;如 2.2 节所述&#xff0c;共享变量的访问始终是“单向信息流”。也就是说&#xff0c;一个进程可以分配新值或检查当前值&#xff0c;但这种检查不会为其他进程留下任何痕迹。结果是&#xff0c;当一个进程想要对共享变量的当前值作…

(十九)Java集合框架深度解析:从基础到高级应用

一、集合框架概述 1.1 什么是集合框架 Java集合框架(Java Collections Framework, JCF)是Java语言中用于表示和操作集合的一套标准化体系结构。它提供了一组接口、实现类和算法&#xff0c;用于存储和操作对象组&#xff0c;解决了数组在存储对象时的诸多限制。 集合框架的主…

Blender cycles烘焙贴图笔记

下载了一些枪模型&#xff0c;一个模型有七八个材质&#xff0c;一个扳机、准星还有单独的材质&#xff0c;用的贴图只有一小部分有内容&#xff0c;对Draw Call非常不友好。不得不学一下怎么用Blender减材质。 找到了这个视频如何在Blender中将多种材料多张贴图烘焙成一张贴图…

mysql的高可用

1. 环境准备 2台MySQL服务器&#xff08;node1: 192.168.1.101&#xff0c;node2: 192.168.1.102&#xff09;2台HAProxy Keepalived服务器&#xff08;haproxy1: 192.168.1.103&#xff0c;haproxy2: 192.168.1.104&#xff09;虚拟IP&#xff08;VIP: 192.168.1.100&#x…

鸿蒙 系统-安全-程序访问控制-应用权限管控

Ability Kit 提供了一种允许应用访问系统资源&#xff08;如&#xff1a;通讯录等&#xff09;和系统能力&#xff08;如&#xff1a;访问摄像头、麦克风等&#xff09;的通用权限访问方式&#xff0c;来保护系统数据&#xff08;包括用户个人数据&#xff09;或功能&#xff0…

算法-数对的使用

1、数对可用于数组排序中&#xff0c;并且可记忆化排序前的元素下标 #include<iostream> #include<string> #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10; pair<int, int> a[N]; void solve() {ll n;cin …

Linux基础第四天

系统之间文件共享 想要实现两个不同的系统之间实现文件共享&#xff0c;最简单的一种方案就是设置VMware软件的共享文件夹&#xff0c;利用共享文件夹可以实现linux系统和windows系统之间的文件共享&#xff0c;这样就可以实现在windows系统上编辑程序&#xff0c;然后在linux系…

Docker 核心原理详解:Namespaces 与 Cgroups 如何实现资源隔离与限制

#Docker疑难杂症解决指南# Docker 作为容器化技术的代名词,彻底改变了软件的开发、部署和管理方式。它凭借其轻量、快速、一致性强的特性,成为了现代云原生架构的基石。然而,Docker 容器的神奇之处并非“无中生有”,其背后是 Linux 内核的两大核心技术——Namespaces(命名…

GitHub 趋势日报 (2025年05月14日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1xming521/WeClone&#x1f680;从聊天记录创造数字分身的一站式解决方案&…

【Go】从0开始学习Go

文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素&#xff08;核心三部分&#xff09;1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…