完整教程:Flink Watermark机制解析

news/2025/9/28 16:12:09/文章来源:https://www.cnblogs.com/lxjshuju/p/19116995

可以把 Watermark 理解为开发者向 Flink 下达的一个推进其内部事件时间时钟的指令。时钟推进的速度和准确性,取决于对自己数据流乱序特性的了解程度。所谓的“保证”,其实是开发者和 Flink 运行时之间基于定义的策略而达成的一种“契约”。

Flink Watermark 的工作机制可以分为两个核心部分:

  1. Watermark 的时间是如何确定的?
  2. 它如何能“保证”在这之前的所有事件都已经到达了?

Watermark 的时间是如何确定的?

Watermark 的时间戳不是由 Flink 自动猜测的,而是由用户定义的逻辑来生成的。这个逻辑体现在一个叫做 WatermarkGenerator 的组件中。开发者需要根据数据流的特性提供生成 Watermark 的具体算法。

这个过程通常包含两个步骤:

  1. 时间戳分配 (Timestamp Assignment):首先,通过 TimestampAssigner 从每条事件中提取其业务时间(Event Time)。这通常是事件数据本身的一个字段,比如 event.getCreationTime()

  2. Watermark 生成 (Watermark Generation)WatermarkGenerator 会观察这些事件的时间戳,并根据其内部逻辑来决定何时生成新的 Watermark,以及这个 Watermark 的时间戳应该是多少。

WatermarkGenerator 接口定义了两个核心方法:

// ... existing code ...
@Public
public interface WatermarkGenerator {/*** 每个事件都会调用此方法,允许 Watermark 生成器检查并记录事件时间戳,* 或者基于事件本身发出一个 Watermark。*/void onEvent(T event, long eventTimestamp, WatermarkOutput output);/*** 定期调用此方法,可能会发出一个新的 Watermark,也可能不发。** 

此方法的调用周期取决于 {@link* ExecutionConfig#getAutoWatermarkInterval()} 的配置。*/void onPeriodicEmit(WatermarkOutput output); }

为了方便使用,Flink 内置了几种常见的生成策略:

  • 单调递增时间戳 (For Monotonously Ascending Timestamps):这是最简单的情况,适用于事件严格按照时间顺序到达的场景。Watermark 的时间戳基本上就是当前所见到的最新事件的时间戳。

    • 逻辑watermark_timestamp = latest_event_timestamp - 1 (减 1 是为了确保时间戳为 T 的事件能被结束时间为 T 的窗口所包含)。
  • 有界乱序 (For Bounded Out-of-Orderness):这是最常见、最实用的策略。需要告诉 Flink,预计事件最大会迟到多久(例如,5秒)。生成器会追踪到目前为止遇到的最大时间戳 (maxTimestamp),然后发出一个比 maxTimestamp 延迟了指定时间的 Watermark。

    • 逻辑watermark_timestamp = max_timestamp_seen - max_lateness_delay
    • 这在 Flink 中的具体实现如下:
    // ... existing code ...
    public class BoundedOutOfOrdernessWatermarks implements WatermarkGenerator {/** 到目前为止遇到的最大时间戳。 */private long maxTimestamp;/** 此 Watermark 生成器所假定的最大乱序程度。 */private final long outOfOrdernessMillis;
    // ... existing code ...@Overridepublic void onEvent(T event, long eventTimestamp, WatermarkOutput output) {maxTimestamp = Math.max(maxTimestamp, eventTimestamp);}@Overridepublic void onPeriodicEmit(WatermarkOutput output) {output.emitWatermark(new Watermark(maxTimestamp - outOfOrdernessMillis - 1));}
    }

它如何能“保证”之前的事件都已到达?

这是理解 Watermark 的关键:Watermark 是一种启发式机制 (heuristic),而不是一个绝对的物理保证。

一个 Watermark(t) 实际上是开发者对 Flink 系统的一个声明,它的意思是:“我(开发者)相信,不会再有时间戳小于等于 t 的事件到来了。

  • “保证”来自于你的“假设”:这个保证的强度完全取决于你在 WatermarkGenerator 中提供的逻辑是否符合真实数据的特性。

    • 如果你使用了5秒的“有界乱序”策略,你其实是在告诉 Flink 去假设所有事件的迟到时间都不会超过5秒。
    • Flink 会信任这个假设,并使用这个 Watermark 来推进内部的事件时间时钟,从而触发窗口计算等时间相关的操作。
  • 如果假设是错的怎么办?(迟到事件):如果一个时间戳为 t_event 的事件,在系统已经处理了 Watermark(t_watermark) (其中 t_event <= t_watermark) 之后才到达,那么这个事件就被认为是迟到 (late) 的。

    • 默认情况下,Flink 会丢弃这个迟到的事件。
    • 当然,Flink 也提供了处理迟到数据的机制,比如窗口操作中的 allowedLateness(),它允许你在一定宽限期内继续处理迟到的数据。
  • 唯一真正的保证:Watermark.MAX_WATERMARK:只有一个特殊的 Watermark 能提供真正的保证。当一个数据源处理完所有数据后(例如文件读完了),它会发出一个时间戳为 Long.MAX_VALUE 的最终 Watermark。这个 Watermark 标志着“时间的终结”,它能绝对保证此后不会再有任何事件了,从而让 Flink 可以安全地关闭所有未触发的窗口和定时器。

    // ... existing code .../** 标志着事件时间结束的 Watermark。 */public static final Watermark MAX_WATERMARK = new Watermark(Long.MAX_VALUE);
    // ... existing code ...

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

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

相关文章

2025 年北京湖南菜餐厅推荐:小湖南岸以湖湘本味与匠心服务,成京城湘菜口碑之选

2025 年的北京餐饮市场呈现 “冰火两重天” 的格局:一边是同质化竞争加剧、成本高企导致部分品牌陷入经营困境,另一边是坚守品质与特色的餐饮品牌凭借精准定位实现逆势增长。作为全国美食汇聚地,北京的湘菜赛道尤为…

完整教程:龙芯在启动参数里添加串口信息

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ABC425题解

A. Sigma Cubescode #include<bits/stdc++.h> using namespace std; int n; int main(){cin >> n;int ans = 0;for(int i = 1; i <= n; ++i){ans += ((i&1)?-1:1) * (i * i * i); }cout << …

技术分享 | Dify智能体案例分享:智能导诊助手 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

STM32中的Flash、ROM与RAM全解析 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Functions

FunctionsVector std:ranges::sort() -std=c++20 是一个C++20引入的排序函数,收录于#include<algorithm> ()里的内容通常是 vector 和 array(满足随机访问迭代器要求),也可以是其它符合范围 概念 的序列。 使…

科技网站推荐台州找人做网站

1、FACTORY—追MM少不了请吃饭了&#xff0c;麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西&#xff0c;虽然口味有所不同&#xff0c;但不管你带MM去麦当劳或肯德基&#xff0c;只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory (下载源码就到源码网:…

QOJ #5421. Factories Once More 题解

Description 有一个王国,共有 \(n\) 座城市,这些城市编号为 \(1\) 到 \(n\)(包含两端)。 王国中有 \(n-1\) 条双向道路将这些城市相连,并且保证任意两座城市之间都可以通过这些道路到达。 女王最近决定新建 \(k\)…

IDEA JAVA项目gitignore文件模板

target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache### IntelliJ IDEA ##…

自动生成验证码

include int main() { srand(static_cast(time(NULL))); string s = "0123456789zxcvbnmasdfghjklqwertyuiopZXCVBNMASDFGHJKLQWERTYUIOP"; cout << "请输入验证码长度:"; int length; cin…

商城网站带宽控制美肤宝网站建设

运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发…

365 赚钱宝小程序系统:多元化变现与趣味运营一体的小程序解决方案

在数字化营销与流量变现需求增长的当下,365 赚钱宝作为微信小程序运营工具,凭借 “趣味养成 + 广告盈利 + 裂变引流” 模式,为个人与企业提供低门槛、高潜力的流量变现路径,降低技术与维护成本。 一、概述总结 365…

9.22 总结

T1 这题就是一个二分答案,因为 x 特别小所以可以直接跑背包。然后可以 \(O(1)\) check,所以复杂度是一个 \(\log\)。 T2 这题比较难,当时只写了部分分。 T3 这题也只写了部分分。 T4 就是这题的复杂度是 \(O(n^2)\)…

保亭县住房城市建设局网站域名可以绑定几个网站

Q:给你一个有序数组nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。 第一种解决方法&a…

iOS 26 系统流畅度深度评测 Liquid Glass 动画滑动卡顿、响应延迟、机型差异与 uni-app 优化策略 - 教程

iOS 26 系统流畅度深度评测 Liquid Glass 动画滑动卡顿、响应延迟、机型差异与 uni-app 优化策略 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

邯郸做网站熊掌号WordPress获取标签名字

文章目录 前言一、什么是UART&#xff1f;二、K210的UART三、实验过程总结 前言 串口通讯是平时大家进行调试最常用的方法&#xff0c;嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求&#xff0c;它能够灵活地…

即刻搜索收录网站河南省两学一做网站

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;chmod命令用来变更文件或目录的权限。在UNIX系统家族里&#xff0c;文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分&#xff0c;另有3种特殊权限可…

网站app封装怎么做wordpress 后台好卡

短短一生不过数十载&#xff0c;对于很多人而言&#xff0c;作IT、作技术只是生命中的某一段&#xff0c;并非所有。而无论是换工作还是换行业&#xff0c;只是一种形式而已&#xff0c;最终我们追求的是成功、是荣誉、是收获。于是在年轻的这几年里&#xff0c;作为技术人员理…