Apache Flink 中 Watermark 机制详解及其核心原理与应用示例

Watermark(水印)概念

在 Apache Flink 流处理框架中,Watermark 是一个关键的时间概念,用于处理事件时间窗口(event-time processing)中的乱序事件问题。事件时间是指事件本身携带的时间戳,而非数据到达或被处理的时间(即处理时间)。由于网络延迟等因素,事件可能会乱序到达,为了确保在某个时间窗口内完成所有相关的事件处理,Flink 引入了 Watermark 机制。

水印原理

水印是一个特殊的时间戳,代表了某个时间点之前的数据理论上应该都已经到达了系统,即“最多允许的延迟”。例如,如果当前水印值为 t,那么意味着所有时间戳小于等于 t 的事件都应该已经到达了流处理系统。一旦水印时间戳超过了窗口结束时间,窗口就可以被认为是完整的,并触发窗口计算。

水印的作用

  • 乱序容忍:水印机制允许一定程度的数据乱序,只要乱序的数据在其对应窗口关闭之前到达即可。
  • 窗口触发:水印时间戳决定了窗口何时能够关闭并触发计算,从而解决了无界流处理中的时间窗口问题。
  • 精确计数与状态清理:基于水印的事件时间处理能够更准确地计算窗口结果,并在窗口结束后及时清理状态,避免状态无限增长。

核心示例代码(基于 Flink 1.16 版本的 Java API)

Apache Flink 1.16 版本对水印生成器进行了重构,现在推荐使用 WatermarkStrategy 类配合 TimestampAssignerTimestampExtractor 接口来实现。以下是基于 Flink 1.16+ 版本的 Watermark 生成器示例代码:

import org.apache.flink.api.common.eventtime.*;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;// 假设有一个事件类 MyEvent,其中包含一个 long 类型的 eventTimestamp 字段
public class MyEvent {public long eventTimestamp;// 其他属性和构造方法...
}public class CustomWatermarkStrategy extends WatermarkStrategy<MyEvent> {@Overridepublic WatermarkGenerator<MyEvent> createWatermarkGenerator(WatermarkGeneratorSupplier.Context context) {return new BoundedOutOfOrdernessWatermarkGenerator<>(Time.seconds(10)); // 允许10秒乱序}@Overridepublic TimestampAssigner<MyEvent> createTimestampAssigner(TimestampAssignerSupplier.Context context) {return (event, timestamp) -> event.eventTimestamp; // 从事件中提取时间戳}
}public class CustomWatermarkGeneratorExample {public static void main(String[] args) throws Exception {final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 假设有一个 DataStreamSource<MyEvent>DataStreamSource<MyEvent> events = ...;// 创建并应用自定义水印策略DataStream<MyEvent> withTimestampsAndWatermarks = events.assignTimestampsAndWatermarks(new CustomWatermarkStrategy());// 定义窗口操作withTimestampsAndWatermarks.keyBy(event -> event.getKey()) // 假设根据某个键进行分区.window(TumblingEventTimeWindows.of(Time.seconds(30))) // 使用30秒滚动窗口.reduce(new MyReduceFunction()); // 自定义窗口内事件的合并函数env.execute("Watermark Example Job");}
}class MyReduceFunction implements ReduceFunction<MyEvent> {// 实现窗口内事件的合并逻辑@Overridepublic MyEvent reduce(MyEvent value1, MyEvent value2) {// ...return resultEvent;}
}

在这个示例中,CustomWatermarkStrategy 继承自 WatermarkStrategy<MyEvent> 并分别实现了 createWatermarkGeneratorcreateTimestampAssigner 方法。BoundedOutOfOrdernessWatermarkGenerator 是 Flink 内置的一个实用类,它可以根据指定的延迟时间自动产生水印。

createTimestampAssigner 方法指定了如何从 MyEvent 对象中获取事件时间戳,而 createWatermarkGenerator 方法则创建了一个基于允许最大乱序时间(这里是10秒)的水印生成器。当事件时间戳的时间超过当前水印时间戳时,窗口就会被认为完整并触发计算。

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

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

相关文章

RabbitMQ--03--SpringAMQP(SpringBoot集成RabbitMQ)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SpringAMQP1.SpringBoot 的支持https://spring.io/projects/spring-amqp 2.RabbitTemplate3.RabbitListener&#xff08;终极监听方案&#xff09;4.RabbitConfig--…

AI趋势(02)感性/理性双视角理解ChatGPT实现原理

说明&#xff1a;本文主要为非AI专业人士更快速了解和理解AI的角度来进行编写。 1 感性理解ChatGPT实现原理 这里用一个有趣的故事来解释 ChatGPT 的实现原理。 想象一座魔法图书馆&#xff0c;里面收藏着无数的书籍&#xff0c;每本书都是关于人类语言的。这座图书馆里有一…

基于Springboot的防疫物资管理信息系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的防疫物资管理信息系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

IOS/Android App备案(uniapp)

IOS/App备案 IOS备案Android备案 IOS备案 准备好p12证书即可 链接: https://aitoolnav.caichuangkeji.com/#/AppMd5 Android备案 上DCLOUD开发者中心&#xff0c;找到相关应用后&#xff0c;直接查看证书即可获取到MD5 公钥&#xff1a;先根据上述页面下载证书&#xff0c;…

GaussDB(分布式)实例故障处理

一、说明 GaussDB Kernel实例出现故障时&#xff0c;可以按照本节的办法进行实例快速修复。 1、执行gs_om -t status --detail查看集群状态&#xff0c;cluster_state为Normal&#xff0c;balanced为No&#xff0c;请重置实例状态。 2、执行gs_om -t status --detail查看集群…

Python的内建比较函数cmp比较原理剖析

Python中的cmp()函数用于比较两个对象的大小。 cmp( x, y)&#xff1a;比较2个对象&#xff0c;前者小于后者返回-1&#xff0c;相等则返回0&#xff0c;大于后者返回1. Python的cmp比较函数比较原理 Python的cmp函数可以比较同类型之间&#xff0c;或者不同数据类型之间。然…

vue2 中使用音频

vue2 中使用音频 在 template 页面 写入 audio 标签 <template><div><audio ref"moreAudio" :src"moreAudioSrc"></audio><audio ref"noAudio" :src"noAudioSrc"></audio></div> </t…

2024 用CleanMyMac X为您的MAC清理提速吧

CleanMyMac X 是由 MacPaw 公司开发的一款针对 macOS 操作系统的电脑清理工具。它可以帮助用户清理电脑中的垃圾文件、卸载不需要的软件、优化电脑性能等。它的界面简洁明了&#xff0c;操作简单易懂&#xff0c;非常适合普通用户使用。 链接: https://pan.baidu.com/s/1_TFnrI…

微信小程序自定义组件

微信小程序中的自定义组件是指在微信小程序中创建的可重用的、可复用的组件&#xff0c;它可以被多个页面使用。自定义组件可以帮助我们提高开发效率&#xff0c;提高代码的可维护性和可重用性。以下是微信小程序中自定义组件的使用方法&#xff1a; 一. 创建自定义组件 首先…

练习 10 Web [MRCTF2020]你传你呢

和test5一样&#xff0c;文件上传限制为图片&#xff0c;使用.htaccess文件让上传成功图片木马文件进行执行 开屏暴击&#xff0c;差点去世 尝试上传文件 各种过滤&#xff0c;但是能传图片&#xff0c;这里就不写了&#xff0c;我做过的test5遇到过的重复内容 直接尝试在te…

【算法设计与分析】实现Trie前缀树

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串…

一个优秀的开源ChatGpt外壳项目(lobe-chat)

lobe-chat 简介&#xff1a; 开源、现代化设计的 ChatGPT/LLMs 聊天应用与开发框架支持语音合成、多模态、可扩展的插件系统&#xff0c;一键免费拥有你自己的 ChatGPT/Gemini/Ollama 应用。 下载lobe-chat lobe-chat项目开源地址&#xff1a;GitHub - lobehub/lobe-chat: &am…

HTML:浏览器CSS样式前缀

在编写CSS样式时&#xff0c;特别是在处理CSS3以及特定浏览器特有的CSS扩展属性时&#xff0c;为了兼容不同的浏览器&#xff0c;可能需要在CSS属性前面添加特定的浏览器厂商前缀。以下是一些常见的浏览器厂商前缀&#xff1a; .example {/* 普通写法 */transform: rotate(30d…

Maven,pom.xml,查找 子jar包

在IDEA打开pom.xml&#xff0c;会看到这里&#xff1a; 然后如果有需要&#xff0c;把相关的 子jar包 去掉 <dependency><groupId>XXX</groupId><artifactId>XXX</artifactId><exclusions><exclusion><artifactId>xxx</a…

利用opencv获取系统时间

前一篇《c获取系统时间的方法-CSDN博客》博客介绍了如何在不同系统中获取系统时间的方法&#xff0c;但这些方法受系统的限制&#xff0c;如time.h就只能在Linux系统中使用。而opencv则不受系统限制&#xff0c;示例代码如下&#xff0c; #include <opencv2/opencv.hpp>…

零拷贝原理+kafka中的零拷贝

零拷贝原理kafka中的零拷贝 kafka性能之零拷贝传统IO零拷贝mmp优化sendfile优化sendfile DMA scatter/gather优化Kafka是怎么使用零拷贝的 kafka性能之零拷贝 kafka中的零拷贝并不是说完全避免了上下文切换与cpu拷贝的次数, 而是减少这种拷贝次数 传统IO 传统的一次IO流程 rea…

微服务高级篇(二):分布式事务+Seata架构

文章目录 一、分布式事务理论基础1.1 CAP定理1.2 BASE理论 二、初始Seata2.1 Seata的架构2.2 部署TC【事务协调者】服务2.3 微服务集成Seata 三、实践3.1 XA模式3.1.1 原理3.1.2 实现 3.2 AT模式3.2.1 原理3.2.2 脏写问题以及解决方案【全局锁超时处理】3.2.3 实现 3.3 TCC模式…

简单记录一次帮维修手机经历(Vivo x9)

简介 手边有一台朋友亲戚之前坏掉的Vivo X9手机&#xff0c; 一直说要我帮忙修理一下&#xff0c; 我一直是拒绝的&#xff0c; 因为搞程序的不等于维修的&#xff08;会电脑不等于维修电器&#xff09;&#xff0c;不知道这种思路如何根深蒂固的&#xff0c;不过好吧&#xff…

选电气还是电子?哪个更有前途?

点击上方选择“置顶/星标公众号” 福利干货&#xff0c;第一时间送达 大家好&#xff0c;我是麦哥&#xff0c;最近有小伙伴在 星球 里提问; 提问内容 球友提问&#xff1a; 麦哥你好&#xff0c;我是电子电工专业的中职生一枚&#xff0c;今年参加职教高考能上个大专&#xff…

Axure案例分享—折叠面板(附下载地址)

今天和大家分享的Axure案例是折叠面板 折叠面板是移动端APP中常见的组件之一&#xff0c;有时候也称之为手风琴。咱们先看下Axure画出的折叠面板原型效果&#xff0c;然后再对该组件进行详细讲解。 一、功能介绍 折叠或展开多个面板内容&#xff0c;默认为展开一项内容&…