Flink详解系列之五--水位线(watermark)

【FLink】水位线(Watermark) 在Flink中,用来衡量事件时间进展的标记,就被称作“水位线”(Watermark)。说白了就是事件时间戳。 阅读详情

1、概念

在Flink中,水位线是一种衡量Event Time进展的机制,用来处理实时数据中的乱序问题的,通常是水位线和窗口结合使用来实现。

从设备生成实时流事件,到Flink的source,再到多个oparator处理数据,过程中会受到网络延迟、背压等多种因素影响造成数据乱序。在进行窗口处理时,不可能无限期的等待延迟数据到达,当到达特定watermark时,认为在watermark之前的数据已经全部达到(即使后面还有延迟的数据), 可以触发窗口计算,这个机制就是 Watermark(水位线),具体如下图所示。

2、水位线的计算

watermark本质上是一个时间戳,且是动态变化的,会根据当前最大事件时间产生。watermarks具体计算为:

watermark = 进入 Flink 窗口的最大的事件时间(maxEventTime)— 指定的延迟时间(t)

当watermark时间戳大于等于窗口结束时间时,意味着窗口结束,需要触发窗口计算。

3、水位线生成

3.1 生成的时机

水位线生产的最佳位置是在尽可能靠近数据源的地方,因为水位线生成时会做出一些有关元素顺序相对时间戳的假设。由于数据源读取过程是并行的,一切引起Flink跨行数据流分区进行重新分发的操作(比如:改变并行度,keyby等)都会导致元素时间戳乱序。但是如果是某些初始化的filter、map等不会引起元素重新分发的操作,可以考虑在生成水位线之前使用。

3.2 水位线分配器

  • Periodic Watermarks

周期性分配水位线比较常用,是我们会指示系统以固定的时间间隔发出的水位线。在设置时间为事件时间时,会默认设置这个时间间隔为200ms, 如果需要调整可以自行设置。比如下面的例子是手动设置每隔1s发出水位线。

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
// 手动设置时间间隔为1s
env.getConfig().setAutoWatermarkInterval(1000);

周期水位线需要实现接口:AssignerWithPeriodicWatermarks,下面是示例:

public class TestPeriodWatermark implements AssignerWithPeriodicWatermarks<Tuple2<String, Long>> {

    Long currentMaxTimestamp = 0L;
    final Long maxOutOfOrderness = 1000L;// 延迟时长是1s

    @Nullable
    @Override
    public Watermark getCurrentWatermark() {
        return new Watermark(currentMaxTimestamp - maxOutOfOrderness);
    }

    @Override
    public long extractTimestamp(Tuple2<String, Long> element, long previousElementTimestamp) {
        long timestamp = element.f1;
        currentMaxTimestamp = Math.max(timestamp, currentMaxTimestamp);
        return timestamp;
    }
}
  • Punctuated Watermarks

定点水位线不是太常用,主要为输入流中包含一些用于指示系统进度的特殊元组和标记,方便根据输入元素生成水位线的场景使用的。

由于数据流中每一个递增的EventTime都会产生一个Watermark。
在实际的生产中Punctuated方式在TPS很高的场景下会产生大量的Watermark在一定程度上对下游算子造成压力,所以只有在实时性要求非常高的场景才会选择Punctuated的方式进行Watermark的生成。

public class TestPunctuateWatermark implements AssignerWithPunctuatedWatermarks<Tuple2<String, Long>> {
    @Nullable
    @Override
    public Watermark checkAndGetNextWatermark(Tuple2<String, Long> lastElement, long extractedTimestamp) {
        return new Watermark(extractedTimestamp);
    }

    @Override
    public long extractTimestamp(Tuple2<String, Long> element, long previousElementTimestamp) {
        return element.f1;
    }
}

4、水位线与数据完整性

水位线可以用于平衡延迟和结果的完整性,它控制着执行某些计算需要等待的时间。这个时间是预估的,现实中不存在完美的水位线,因为总会存在延迟的记录。现实处理中,需要我们足够了解从数据生成到数据源的整个过程,来估算延迟的上线,才能更好的设置水位线。

如果水位线设置的过于宽松,好处是计算时能保证近可能多的数据被收集到,但由于此时的水位线远落后于处理记录的时间戳,导致产生的数据结果延迟较大。

如果设置的水位线过于紧迫,数据结果的时效性当然会更好,但由于水位线大于部分记录的时间戳,数据的完整性就会打折扣。

所以,水位线的设置需要更多的去了解数据,并在数据时效性和完整性上有一个权衡。

flink 时间语义、水位线(Watermark)、生成水位线、水位线的传递   在flink中,当希望对数据按照时间窗口来进行收集计算时,时间的衡量标准就非常重要   如图:在事件发生之后,生成的数据被收集起来,首先进入分布式消息队列,然后被 Flink 系统中的 Source 算子读取消费,进而向下游的转换算子(窗口算子)传递,最终由窗口算子进行计算处理。   在这个过程中,有两个非常重要的时间点:一个是数据产生的时间,把它叫作(Event Time);另一个是数据真正被处理的时刻,叫作(Processing Time);窗口操作以那种时间作为衡量标准,就是所谓的(Notion 阅读详情

相关推荐

Flink 水位线(Watermark)

文章目录什么是水位线水位线的特性如何生成水位线Flink 内置水位线生成器自定义水位线策略在自定义数据源中发送水位线水位线的总结 在实际应用中,一般会采用事件时间语义。而水位线,就是基于事件时间提出的概念。一个数据产生的时刻,就是流处理中事件触发的时间点,这就是“事件时间”,一般都会以时间戳的形式作为一个字段记录在数据里。这个时间就像商品的“生产日期”一样,一旦产生就是固定的,印在包装袋上,不会因为运输辗转而变化。如果我们想要统计一段时间内的数据,需要划分时间窗口,这时只要判断一下时间戳就可以知道数据属于哪

weixin_45417821的博客 4307

Flink Sql 中 Watermark 使用方式

1、创建 env 和 tableEnv 环境 2、利用 Sql 定义 Source 数据源(并在数据源中定义Watermark和event-time),连接Source 3、利用滑动窗口Hop测试Watermark和event-time是否定义成功 4、利用Window TopN实现业务逻辑 val env = StreamExecutionEnvironment.getExecutionEnvironment env.setParallelism(1) val sett

Y_FC_EMBEDD的博客 6198

Flink WaterMark水位线(水印)的深入理解

1,最近看书,结合一些视频,对水印的原理完全的理清楚了,也是个搬运工行为吧,希望做个总结,防止遗忘。 我们首先得知道watermaker的作用: 1)非常重要的作用是解决数据乱序的,如果你的数据是有序的,使用它意义不大 2)到了窗口关闭时间而不是立马触发窗口计算,而是等待一段时间,等迟到的数据进来。 我们看下图代码就可以知道: 所以要触发水印,总结就是为2个条...

qq_31866793的博客 3435

FlinkSQL的Watermark机制和Checkpoint机制

Watermark机制,就是水印机制,也叫做水位线机制。就是专门用来解决流式环境下数据迟到问题的。

sijiwang95的博客 2296

【Flink】Flink 中的时间语义和水位线

水位线是一种特殊的事件,由程序员通过编程插入的数据流里面,然后跟随数据流向下游流动。

克里斯的博客 2803

FlinkSQL 水印(Watermark)的使用和编程实例

在事件流处理中,我们通常需要根据事件的发生时间进行计算和分析,而事件的发生时间并不总是与事件到达处理系统的时间一致。由于网络传输延迟、数据乱序等原因,事件的到达顺序和事件的实际发生顺序可能存在差异。为了解决这个问题,Flink 引入了水印的概念。水印是一种特殊的事件,它带有一个时间戳,并用于表示在该时间戳之前的事件已经全部到达。换句话说,水印标识了事件时间轴上的一个时间点,该时间点之前的事件都已经到达。水印的引入可以帮助我们处理乱序事件、处理延迟数据以及触发窗口计算等操作。

PixelLancer的博客 888

Flink 水位线(Watermark)个人总结

在Flink中,用于衡量事件时间进展的标记,被称为水位线。可以看作一条特殊的数据记录,它是插入到数据流中的一个标记点。主要内容就是一个时间戳,用来指示当前的事件时间自身理解:本质上就是一个时间戳,表示比这个时间早的事件已经全部到达。并且在数据乱序的情况下,通过水位线可以判断出迟到的数据。

m0_72566748的博客 3615

大数据Flink(七十八):SQL 的水印操作(Watermark)

4.后面几个以此类推,直到Event Time为:1648197590000的数据进来的时候,前一条数据的WaterMark为1648197589000,于是更新当前的WaterMark为1648197590000,Flink认为1648197590000之前的数据都已经到达,且达到了窗口的触发条件,开始进行计算。可以看到,设置了最大允许乱序时间后,WaterMark要比原来低5秒,可以对延迟5秒内的数据进行处理,窗口的触发条件也同样会往后延迟关于延迟时间,请结合业务场景进行设置。

Lansonli(蓝深李)的博客 1463

Flink之水位线(Watermark)

在流数据处理应用中,一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”,一般就是划定的一段时间范围,也就是“时间窗”;对在这范围内的数据进行处理,就是所谓的窗口计算。所以窗口和时间往往是分不开的。接下来我们就深入了解一下 Flink 中的时间语义和窗口的应用。

四维大脑的博客 8152

Flink 水位线机制WaterMark实践 处理乱序消息

1 水位线(WaterMark)是一个时间戳,等于当前到达的消息最大时间戳减去配置的延迟时间,水位线是单调递增的,如果有晚到达的早消息也不会更新水位线,因为消息最大时间戳没变 2 新消息到达时,才计算新的水位线,如果水位线大于等于窗口的endTime(左闭右开)则触发窗口计算,反之继续接收后续消息;消息的EventTime大于等于窗口beginTime则保留,反之被丢弃 3消息的EventTime小于水位线时不一定被丢弃;消息的EventTime小于窗口beginTime时才会被丢弃 4 与wind.

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 2536

钣金设计高薪进阶:从材料工艺到DFMA降本增效全解析

钣金设计是机械制造领域的核心技术之一,它涉及将金属板材通过切割、折弯、焊接等工艺成型为所需零件。其核心原理在于深刻理解材料特性、制造工艺约束与结构力学,以确保设计在功能、成本与可制造性之间取得最佳平衡。这项技术的价值在于,优秀的钣金设计能直接驱动产品降本增效,通过优化材料利用率、简化装配工序和避免设计缺陷,为企业节省大量模具与生产成本。其应用场景广泛,从机箱机柜、汽车部件到电子设备外壳无处不在。本文将聚焦于实现这一价值的关键路径,深入探讨面向制造与装配的设计(DFMA)原则在钣金领域的实战应用,并剖析如何通

weixin_34301132的博客 391

Flink的Watermark水位线详解

Flink有如下三种时间语义:在实际应用中,一般会采用事件时间语义。而正如前面所说的,事件时间语义需要等窗口的数据全部到齐了,才能进行窗口计算。那么,什么时候数据就都到齐了呢?这里我们引入水位线的概念。二、为什么要引入水位线?不能用数据本身带有的时间戳来驱动吗?如果用数据本身所带有的时间戳来进行驱动,将会面临如下问题:(1)如果面临聚合计算,数据本身所带有时间戳也会参与聚合,则聚合之后一批数据只会输出一个结果,那么下游的数据量就会变少,进而影响时间进度控制的精细程度。

lx104921的博客 1753

个人信息保护合规审计人员(高级)能力考核试卷+面试模拟

《个人信息保护合规审计考试与面试指南》 摘要:本文提供个人信息保护合规审计考试及面试的全面指导。考试采用闭卷笔试形式,满分100分,合格线75分,时长120分钟,包含单选、多选、判断题及综合案例分析题。内容涵盖《个人信息保护法》核心条款、审计程序、风险评估等实务要点。面试环节采用情景模拟方式,重点考察应试者在压力下处理审计独立性、客户关系与监管要求的平衡能力,以及应对数据泄露等突发事件的处置流程。案例题聚焦大型互联网平台的数据收集、共享、跨境传输等高风险环节的合规审计,要求设计完整的审计方案框架。面试评分标

qq_41525079的博客 1142

Flink之Watermark水印、水位线

在Apache Flink中,Watermark即水印、水位线,它是插入到数据流中的一个标记点,主要内容就是一个时间戳,用来指示当前事件时间。通过使用水位线机制,能够动态地处理乱序事件,并在保证准确性的同时提供低延迟的数据处理。

积跬步,至千里。 2026

C#上位机通信层封装:西门子S7NetPlus库的优雅使用

支持S7-1200/1500(机架号0,槽号1)、S7-300/400(机架号/槽号需根据实际配置);支持位(Bit)、字节(Byte)、字(Word)、双字(DWord)、浮点数(Float/Double)等数据类型的读写;支持DB块、输入寄存器(I)、输出寄存器(Q)、内存寄存器(M)、定时器(T)、计数器(C)的操作;轻量无依赖,兼容.NET 5+。首先定义核心枚举和常量,统一规范参数类型,避免硬编码。/// 西门子PLC型号(对应不同的机架/槽号默认配置)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1085

SAPIEN ManiSkill3 入门教程(一)

请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。

机器人控制与仿真应用 3072

Flink Watermark(水位线)机制详解

Flink Watermark机制是处理事件时间和乱序数据的核心技术。Watermark作为时间戳标记,表示"所有时间戳≤Watermark的数据已到达",用于确定何时触发窗口计算。核心功能包括:1)处理乱序数据;2)确定窗口触发时机;3)支持多种生成策略(周期性/标点式)。主要实现方式有:forBoundedOutOfOrderness(允许固定延迟)、forMonotonousTimestamps(无乱序)和自定义策略。Watermark通过最大事件时间减去允许延迟来计算,确保延迟数

ljw714的专栏 1424

微信小程序- 云开发上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。(小程序上传部署云函数提示错误,开发控制台中的云函数没有删除,详细排查)

微信小程序——云函数上传失败,微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。微信小程序上传云函数失败,微信小程序云开发|Error: ResourceNotFound.FunctionName, FunctionName 指定的资源不存在。微信云开发报错(Error: ResourceNotFound.FunctionName,微信小程序云函数报错,上传云函数 sum 失败 Error:,上传部署我们的云函数 2. 报错 错误信息

🏆 前端领域优质创作者 4313

【Flink】(五)时间语义和水位线 (Watermark)

文章目录一、Flink 中的时间语义二、EventTime 的引入三、 Watermark(水位线)3.1 基本概念 一、Flink 中的时间语义 在 Flink 的流式处理中,会涉及到时间的不同概念,如下图所示: Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink 通过时间戳分配器访问事件时间戳。 Ingestion Time:是数据进入 Flink 的时间。 Processing Time:是每一个执行基于时间操作的

云祁QI 1952

倍福EL6002做RS232通信获取称重数据..

本文介绍EL6002模块通过RS232自由口通信协议获取从站数据。具体数据对照说明手册即可。

weixin_41883890的博客 1010

133.在 Vue3 中使用 OpenLayers 实现画多边形、任意编辑、遮罩与剪切处理功能

《Vue3+OpenLayers实现多边形绘制与区域处理》摘要:本文介绍如何基于Vue3+OpenLayers+ol-ext实现地图多边形交互功能。核心功能包括:鼠标绘制任意多边形、拖动顶点编辑边界、遮罩显示(非选区变红)、选区剪切显示及功能重置。技术方案采用OpenLayers处理地图渲染,ol-ext实现高级遮罩/剪切效果,ElementPlus提供UI控件。该方案适用于城市规划、园区展示等需要区域标记的场景,完整代码展示了从初始化、绘制、编辑到特效处理的全流程实现。

小彭的博客 959

Flink WaterMark 详解

在进行窗口处理时,不可能无限期的等待延迟数据到达,当到达特定watermark时,认为在watermark之前的数据已经全部达到(即使后面还有延迟的数据), 可以触发窗口计算,这个机制就是 Watermark(水位线),具体如下图所示。如果水位线设置的过于宽松,好处是计算时能保证近可能多的数据被收集到,但由于此时的水位线远落后于处理记录的时间戳,导致产生的数据结果延迟较大。如果设置的水位线过于紧迫,数据结果的时效性当然会更好,但由于水位线大于部分记录的时间戳,数据的完整性就会打折扣。3.2 水位线分配器。

freeRoad 1661

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Flink WaterMark

文章目录背景概念window划分示例提取watermarkAssignerWithPeriodicWatermarksAssignerWithPunctuatedWatermarks使用设置数据流时间特征代码代码详解试验第一次第二次第三次第四次第五次第六次结论总结Flink如何处理乱序?Flink何时触发window?Flink应该如何设置最大乱序时间?参考 背景 实时计算中,数据时间比较敏感。...

小杨的技术博客 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【5】flink窗口与水位线watermark例子

【README】 本文总结了flink时间语义和水位线的知识; 【1】时间语义 1)时间分类 Event Time: 事件创建的时间(事件发生时间); Ingestion Time:数据进入flink的实际; Processing Time:执行算子的本地机器时间 ; 我们主要讨论的是 事件时间; 【2】水位线 ...

PacosonSWJTU的博客 1867
上一篇: Flink详解系列之六--窗口机制
下一篇: Flink详解系列之四--时间
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值