Flink 系列第6篇:Watermark 水印全解析(原理+实操+避坑)

flink Watermark 水印原理 flink Watermark 源码分析 阅读详情

专栏定位:聚焦 Flink Watermark(水印)核心原理、生成策略、实操代码,详解水印如何解决数据乱序、多流处理及空闲数据源问题,覆盖生产全场景避坑要点

适用人群:Flink 开发工程师、实时计算落地人员、大数据初学者,需掌握 Flink 事件时间(EventTime)及窗口基础

核心价值:吃透 Watermark 工作机制,熟练配置水印生成策略,解决生产中数据乱序、窗口触发异常、水印停滞等核心问题,保障实时计算的准确性与实时性

一、Watermark 核心介绍(EventTime 处理的关键)

1.1 Watermark 简介

Watermark(水印)本质上是一种单调递增的时间戳,是 Flink 为处理 EventTime 窗口计算而设计的核心机制,用于标记数据流的时间进度。

  • 核心关联:仅针对 EventTime,与 ProcessingTime 无关,是 EventTime 窗口能够正确触发的核心前提。

  • 生成方式:由 Flink Source 或自定义的 Watermark 生成器,以 Punctuated(标点式)或 Periodic(周期性)两种方式生成,属于系统事件。

  • 核心语义:它表示“所有时间戳 ≤ Watermark 的数据都已经到达系统”,算子接收到水印后,会认为不会再有小于该水印时间戳的数据到来。

  • 核心作用:告诉 Flink 数据流在时间维度上已处理到的位置,为窗口计算提供触发信号。

1.2 引入 Watermark 的必要性

在 EventTime 处理场景中,数据乱序和延迟计算是两大核心难题,Watermark 的引入正是为了解决这两个问题,平衡数据准确性与处理实时性。

1.2.1 解决的两大核心难题

  • 数据乱序:数据到达 Flink 的顺序与事件实际发生的顺序不一致(常见于网络传输、分布式数据源)。

    • 解决方案:设置允许延迟的阈值(如5秒),让系统多等待一段时间,接收延迟到达的乱序数据。
  • 延迟计算:系统无法判断何时数据已全部到齐,无法安全触发窗口计算(如“9点到9点05分的窗口,数据是否已全部到达?”)。

    • 解决方案:Watermark 提供明确的计算触发信号——“时间戳≤Watermark的数据已到齐,可以计算窗口结果!”

1.2.2 无 Watermark 的问题

若不使用 Watermark,EventTime 窗口计算会陷入两种极端,均无法满足生产需求:

  • 窗口无限期等待:始终不确定是否还有延迟数据到来,无法输出计算结果;

  • 窗口提前关闭:直接关闭窗口并输出结果,导致迟到数据被丢弃,计算结果不准确。

1.3 Watermark 的核心作用

  • 控制事件时间进展:推动 Flink 内部的 EventTime 时钟向前推进;

  • 判断迟到数据的标准:时间戳小于当前 Watermark 的数据,会被判定为迟到数据;

  • 触发窗口计算:当 Watermark ≥ 窗口结束时间时,触发该窗口的聚合计算;

  • 平衡延迟与准确性:通过设置延迟容忍度,在“等待更多延迟数据”和“及时输出结果”之间找到最优平衡。

1.4 核心原则:Watermark 必须单调递增

Watermark 的本质是 EventTime 的进展标记,其核心原则是:Watermark 的时间戳只能前进(或保持不变),绝不能后退。一旦 Watermark 后退,会导致窗口重复触发、数据重复计算等严重问题。

核心计算公式: Watermark=max(历史最大EventTime,新数据EventTime)−延迟阈值Watermark = max(历史最大EventTime, 新数据EventTime) - 延迟阈值Watermark=max(历史最大EventTime,新数据EventTime)−延迟阈值

实例解析(理解单调性原则)

场景:数据乱序到达,允许延迟5秒,数据及到达顺序如下:

事件时间轴:9:00   9:05   9:10   9:15                           9:20
数据到达:  [A]    [C]    [B]   (B的时间戳是9:08,但9:15才到)

Watermark 生成过程(关键关注乱序数据 B):

  • 收到 A(9:00):历史最大 EventTime = 9:00 → Watermark = 9:00 - 5s = 8:55;

  • 收到 C(9:10):历史最大 EventTime = 9:10 → Watermark = 9:10 - 5s = 9:05;

  • 收到 B(9:08):新数据 EventTime = 9:08,历史最大 EventTime = 9:10 → 取 max(9:10, 9:08) = 9:10 → Watermark = 9:10 - 5s = 9:05(保持不变,不后退)。

关键说明:若直接用 B 的时间戳计算(9:08 - 5s = 9:03),会导致 Watermark 从 9:05 后退到 9:03,违反单调性原则。Flink 采用“取历史最大 EventTime 为基准”的策略,确保 Watermark 始终单调递增。

窗口触发时机:对于 [9:00-9:05] 的窗口,当 Watermark ≥ 9:05 时(即收到 C 之后),触发窗口计算。

二、Watermark 的使用方法(实操核心)

2.1 Watermark 的生成策略

Flink 提供两种核心水印生成方式,需根据业务场景选择,实际生产中以 Periodic 方式为主。

水印生成策略示意图:

2.1.1 两种生成方式对比

  • Punctuated(标点式)

    • 生成逻辑:数据流中每一个递增的 EventTime 都会产生一个 Watermark;

    • 优点:实时性极高,能第一时间反映数据的时间进度;

    • 缺点:在 TPS 很高的场景下,会产生大量水印,增加下游算子压力;

    • 适用场景:实时性要求极高(如毫秒级响应)的业务。

  • Periodic(周期性)

    • 生成逻辑:周期性(按固定时间间隔、或达到一定记录条数)产生一个 Watermark;

    • 优点:可控制水印生成频率,避免大量水印占用资源,性能更稳定;

    • 缺点:实时性略低于 Punctuated 方式;

    • 适用场景:绝大多数生产场景,需结合时间间隔和数据条数双重控制,避免极端情况下的延迟。

2.1.2 核心 API 调用

构建 DataStream 后,通过 assignTimestampsAndWatermarks() 方法配置水印,需传入 WatermarkStrategy 对象(水印策略),核心语法:

DataStream.assignTimestampsAndWatermarks(WatermarkStrategy<T>)

2.1.3 WatermarkStrategy 与 WatermarkGenerator

WatermarkStrategy 是水印策略的核心接口,提供静态方法和默认实现,核心是返回一个 WatermarkGenerator(水印生成器)。

WatermarkStrategy 核心方法(需实现):

/**
  * 实例化水印生成器,根据策略生成水印
  */
@Override
WatermarkGenerator<T> createWatermarkGenerator(WatermarkGeneratorSupplier.Context context);

WatermarkGenerator 接口(水印生成器),核心有两个方法:

@Public
public interface WatermarkGenerator<T> {
    /**
  * 每处理一条数据都会调用,可记录事件时间戳,或基于数据发射水印
  */
    void onEvent(T event, long eventTimestamp, WatermarkOutput output);
    
    /**
  * 周期性调用,可选择发射水印(周期由 ExecutionConfig 配置)
  * 周期设置:env.getConfig().setAutoWatermarkInterval(5000L); // 5秒一次
  */
    void onPeriodicEmit(WatermarkOutput output);
}
  • onEvent:每条数据都会触发,可用于标点式水印生成;

  • onPeriodicEmit:周期性触发(默认周期100ms,可自定义),用于周期性水印生成。

2.2 内置水印生成策略(实操首选)

Flink 提供两种常用内置水印生成策略,无需自定义实现,直接调用即可满足大部分业务需求。

2.2.1 单调递增水印生成器(无乱序场景)

  • 特点:数据时间戳严格递增,无乱序,无需设置延迟阈值;

  • 核心方法:WatermarkStrategy.forMonotonousTimestamps();

  • 生成逻辑: Watermark=当前最大时间戳−0msWatermark = 当前最大时间戳 - 0msWatermark=当前最大时间戳−0ms (无延迟);

  • 底层实现:AscendingTimestampsWatermarks,是 BoundedOutOfOrdernessWatermarks 的子类(延迟时间为0);

  • 实操代码:

// 数据源:DataStream<T>,数据时间戳严格递增
DataStream dataStream = ...... ;
// 配置单调递增水印
dataStream.assignTimestampsAndWatermarks(WatermarkStrategy.forMonotonousTimestamps());

2.2.2 固定延迟时间水印生成器(乱序场景)

  • 特点:数据存在乱序,需设置最大允许延迟时间,平衡准确性与实时性;

  • 核心方法:WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10));(参数为最大允许延迟);

  • 生成逻辑: Watermark=当前最大时间戳−最大允许延迟Watermark = 当前最大时间戳 - 最大允许延迟Watermark=当前最大时间戳−最大允许延迟 ;

  • 实操代码:

// 数据源:DataStream<Event>,Event 包含 timestamp 字段(事件时间戳)
DataStream<Event> stream = input
    .assignTimestampsAndWatermarks(
        WatermarkStrategy
            .<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)) // 允许5秒延迟
            .withTimestampAssigner((event, timestamp) -> event.timestamp) // 提取EventTime
    );

关键说明:forBoundedOutOfOrderness(Duration) 用于设置最大允许延迟,延迟时间需根据业务实际乱序情况调整(如3秒、5秒、10秒)。

2.3 Watermark 单位与 EventTime 提取

2.3.1 Watermark 时间戳单位

Watermark 本质是时间戳,Flink 默认时间戳单位为 毫秒(Unix 时间戳)。若数据中的时间戳为秒或微秒,需手动转换为毫秒。

// 示例:将秒级时间戳转换为毫秒级
.withTimestampAssigner((event, recordTimestamp) -> event.timestamp * 1000)

注意:时间戳字段可不为 Long 类型,但最终提取后的值必须是毫秒级时间戳。

2.3.2 提取 EventTime(TimestampAssigner)

水印生成依赖 EventTime,需从数据中提取 EventTime,这就需要用到 TimestampAssigner 接口(函数式接口),核心方法:

@Public
@FunctionalInterface
public interface TimestampAssigner<T> {
    long extractTimestamp(T element, long recordTimestamp);
}

实操示例(从 Tuple2 中提取 EventTime):

DataStream dataStream = ...... ;
dataStream.assignTimestampsAndWatermarks(
    WatermarkStrategy
    .<Tuple2<String,Long>>forBoundedOutOfOrderness(Duration.ofSeconds(5))
    .withTimestampAssigner((event, timestamp)->event.f1) // 从第二个字段提取EventTime
);

2.4 水印使用最佳实践

  • 生成位置尽量靠前:最佳实践是在尽量接近 Source 的地方生成水印,甚至在 SourceFunction 中直接生成,避免分区操作(如 keyBy)打乱水印顺序。

  • 允许窄依赖预处理:在生成水印前,可对数据流进行 map、filter 等窄依赖操作(不改变数据分区),不影响水印准确性。

  • 实操示例:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

// 设置时间特征为 EventTime(必须)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

DataStream<SensorReading> readings = env
  .addSource(new SensorSource) // 数据源
  .filter(r -> r.temperature > 25) // 窄依赖预处理(过滤)
  .assignTimestampsAndWatermarks(new MyAssigner()); // 生成水印

三、Watermark 如何解决乱序问题(核心场景)

3.1 问题描述(生产常见场景)

某数据源存在数据延迟(如网络原因),延迟时间约5秒,例如:EventTime 为11秒的数据,在实际时间16秒时才到达 Flink,此时如何确保窗口计算结果准确?

场景补充:使用5秒滚动窗口(Tumble Window),需确保 EventTime=11秒的数据被正确分配到 [10-15秒] 窗口,而非 [15-20秒] 窗口。

3.2 EventTime 窗口触发条件

EventTime 窗口的触发核心条件:当窗口的结束时间 ≤ 当前系统的 Watermark 时间戳时,触发窗口计算。

通过调整水印生成策略,可解决乱序数据导致的窗口计算不准确问题,以下是两种核心策略对比。

3.2.1 策略1:Watermark = EventTime(无延迟,不推荐用于乱序场景)

核心逻辑:水印时间戳等于当前最大 EventTime,无延迟等待,适用于无乱序数据场景。

对应的 DDL 配置(Flink SQL):

CREATE TABLE source(
  ...,
  Event_time TimeStamp,   -- 事件时间字段
  WATERMARK wk1 FOR Event_time as withOffset(Event_time, 0) -- 水印无延迟
) with (
  ... -- 数据源配置
);

问题:延迟数据(如 EventTime=11秒,16秒到达)会被判定为迟到数据,无法进入对应窗口,导致计算结果不准确。

3.2.2 策略2:Watermark = EventTime - 5s(设置延迟,推荐用于乱序场景)

核心逻辑:设置5秒延迟,水印时间戳 = 当前最大 EventTime - 5s,给乱序数据留足到达时间。

对应的 DDL 配置(Flink SQL):

CREATE TABLE source(
  ...,
  Event_time TimeStamp,  -- EventTime 字段
  WATERMARK wk1 FOR Event_time as withOffset(Event_time, 5000) -- 延迟5秒(5000毫秒)
) with (
  ... -- 数据源配置
);

优势:EventTime=11秒的数据(16秒到达),此时水印时间戳 = 16秒 - 5秒 = 11秒,满足“窗口结束时间(15秒)≥ 水印时间戳(11秒)”,数据可正确进入 [10-15秒] 窗口,确保计算结果准确。

核心原理:通过延迟触发窗口计算,正确处理 Late Event(迟到数据),平衡准确性与实时性。

四、多流的 Watermark 处理(生产避坑点)

4.1 多流汇聚的问题

当多个流通过 Union、GroupBy 等操作合并到同一个处理节点时,每个流会携带各自的 Watermark,此时可能出现“多流水印不单调递增”的问题,违反 Watermark 核心原则。

4.2 Flink 处理方案

Flink 为保证多流汇聚后 Watermark 的单调性,采用“木桶原理”处理:当多流汇聚时,Flink 会选择所有流入流的 Watermark 中最小的一个,作为下游的 Watermark 向下传递。

优势:确保下游接收的 Watermark 始终单调递增,避免窗口触发异常、数据重复计算等问题。

注意:若某一个流的 Watermark 停滞(如无数据),会导致全局 Watermark 被拖慢,需结合“空闲数据源”处理方案解决。

五、空闲数据源处理(生产关键避坑)

5.1 空闲数据源简介与典型场景

在 Flink Keyed 数据流中,空闲数据源指:某个 Key 的分区(partition)在一段时间内(如5分钟)没有任何数据到达,但其他 Key 的分区仍有数据持续流入。

典型场景:

  • 多租户系统:某个用户突然停止产生数据;

  • 多地区数据:某个地区的数据源暂时中断;

  • 多设备监控:某个设备离线,停止上报数据。

5.2 空闲数据源的不良影响

核心问题是Watermark 停滞(全局进度阻塞),遵循“木桶原理”: 全局Watermark=min(所有并行分区的Watermark)全局Watermark = min(所有并行分区的Watermark)全局Watermark=min(所有并行分区的Watermark) ,进而引发一系列问题:

  • 窗口无法触发:全局 Watermark 无法推进,依赖水印的窗口计算无法触发;

  • 状态无限增长:窗口无法关闭,窗口状态、Timer 无法清理,导致内存泄漏;

  • 实时性丧失:数据处理延迟从秒级退化为小时级,实时监控、告警失效。

5.3 处理方案(withIdleness 方法)

Flink 提供 withIdleness() 方法专门处理空闲数据源,允许将长时间无数据的分区标记为“空闲”,排除在全局 Watermark 计算之外,确保全局水印正常推进。

核心代码示例

WatermarkStrategy<Event> strategy = WatermarkStrategy
    .<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)) // 允许5秒乱序延迟
    .withTimestampAssigner((event, ts) -> event.timestamp) // 提取EventTime
    .withIdleness(Duration.ofMinutes(5)); // 5分钟无数据,标记该分区为空闲

工作原理(4步闭环)

  1. 检测空闲:某个分区超过指定时间(如5分钟)无数据到达;

  2. 标记空闲:将该分区从全局 Watermark 计算中排除;

  3. 全局推进:全局 Watermark 基于剩余活跃分区的 Watermark 计算,继续向前推进;

  4. 恢复参与:当该分区再次有数据到达时,重新参与全局 Watermark 计算,恢复活跃状态。

进阶配置与监控

  • 空闲时间调整:根据业务场景设置,实时业务可设较短时间(如5分钟),批量业务可设较长时间(如1小时):
    .withIdleness(Duration.ofMinutes(5)); // 实时业务(推荐) .withIdleness(Duration.ofHours(1)); // 批量业务

  • Watermark 停滞监控:在 ProcessFunction 中监控水印进展,触发告警:
    // 在 KeyedProcessFunction 的 processElement 或 onTimer 方法中 long currentWatermark = ctx.timerService().currentWatermark(); // 若 Watermark 延迟超过1分钟,触发告警 if (currentWatermark < System.currentTimeMillis() - 60000) { alert("Watermark停滞可能!请检查数据源是否空闲或异常!"); }

  • 多级超时策略:重要业务可结合双重机制,确保水印正常推进:
    WatermarkStrategy .forBoundedOutOfOrderness(Duration.ofSeconds(30)) // 乱序延迟30秒 .withIdleness(Duration.ofMinutes(5)) // 第一级:标记空闲分区 .withTimeout(Duration.ofMinutes(30)); // 第二级:完全超时(按需配置)

六、全篇核心总结

  1. Watermark 是 Flink EventTime 处理的核心,本质是单调递增的时间戳,用于标记数据时间进度、触发窗口计算、解决数据乱序问题。

  2. 核心原则:Watermark 必须单调递增,计算公式为 Watermark=max(历史最大EventTime,新数据EventTime)−延迟阈值Watermark = max(历史最大EventTime, 新数据EventTime) - 延迟阈值Watermark=max(历史最大EventTime,新数据EventTime)−延迟阈值 。

  3. 生成策略:分为 Periodic(周期性,生产首选)和 Punctuated(标点式,高实时场景),内置两种生成器可满足大部分业务需求。

  4. 乱序处理:通过设置固定延迟水印(Watermark = EventTime - 延迟阈值),给乱序数据留足到达时间,确保窗口计算准确。

  5. 多流处理:多流汇聚时,Flink 取所有流入流水印的最小值作为下游水印,保证单调性。

  6. 空闲数据源:使用 withIdleness() 方法标记空闲分区,避免全局 Watermark 停滞,防止窗口无法触发、内存泄漏。

  7. 实操关键:水印生成位置尽量靠前,延迟阈值根据业务乱序情况调整,做好水印停滞监控,避免生产异常。

flink重温笔记(九):Flink 高级 API 开发——flink 四大基石之WaterMark(Time为核心) 当 flink 以 EventTime 模式处理流数据时,它会根据数据里的时间戳来处理基于时间的算子。但是由于网络、分布式等原因,会导致数据乱序的情况。 结论:只要使用 event time,就必须使用 watermark,在上游指定,比如:source、map算子后。Watermark 的核心本质可以理解成一个延迟触发机制。因为前面提到,数据时间 >= 窗口结束时间,触发计算,这里想要延迟触发计算,所以水印时间一般比数据事件时间少几秒水印时间 = 事件时间 - 设置的水印长度水印的功能:在不影响按照事件 阅读详情

相关推荐

Flink Watermark原理与代码实例讲解

Flink Watermark原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来 在处理实时流数

AI天才研究院 988

Flink系列之:Generating Watermarks生成水印

为了使用事件时间,Flink 需要知道事件时间戳,这意味着流中的每个元素都需要分配其事件时间戳。这通常是通过使用 TimestampAssigner 从元素中的某些字段访问/提取时间戳来完成的。时间戳分配与生成水印密切相关,水印告诉系统事件时间的进展情况。可以通过指定 WatermarkGenerator 来配置它。Flink API 需要一个包含 TimestampAssigner 和 WatermarkGenerator 的 WatermarkStrategy。

zhengzaifeidelushang的博客 1288

Tessent IJTAG ICL:从规范到实践的硬件描述语言指南

本文深入解析Tessent IJTAG ICL语言在硬件测试中的应用,从规范到实践提供全面指南。通过模块化设计、网络提取与编辑等实战技巧,帮助工程师高效构建标准化测试网络,显著提升芯片测试效率与覆盖率。特别分享TDR/SIB/TAP的ICL实现方法及调试策略,适用于SoC、车载芯片等复杂场景。

weixin_33606346的博客 299

Flink事件时间和水印详解

前言 Flink使用版本:1.12.1。   水印是一个标记的时间戳,是一个标记:意味着水印代表时间前的数据均已到达(人为的设定——开发人员可以控制延迟和完整性之间的权衡),这一点水印保障了乱序问题的解决(这很重要,特别是多分区kafka消费)。因为在流处理中,面对乱序问题,你不可能一直等待数据的到达而不去对数据进行操作(尤其像是聚合操作这类操作)。故此面对超时到达的数据你必须进行处理,如何判断超时数据——水印,你也可以设置一定的延迟时间。这两点(解决乱序;允许延迟)也是水印的主要功能。第二点通常与窗口一起

长臂人猿的博客 6191

Cursor聊天记录迁移工具:实现跨设备AI对话同步与备份

在软件开发中,数据持久化与迁移是常见需求,尤其当工具依赖本地存储时。SQLite作为轻量级关系型数据库,因其嵌入式、零配置特性,常被用于存储应用状态与用户数据。其WAL(预写式日志)模式提升了并发性能,但也增加了数据操作复杂性。通过命令行工具与JSON序列化技术,可以实现结构化数据的提取、转换与安全迁移,这对于保障开发资产的连续性与可移植性具有重要价值。例如,在AI辅助编程场景下,开发者与AI的对话记录包含关键的问题分析、解决方案与决策逻辑,是重要的上下文资产。cursor-chat-transfer工具正

weixin_42551967的博客 533

centos7安装db2 version11.1

centos7安装db2 version11.1

AKA石头 1060

大数据-玩转数据-Flink 水印

是指的执行操作的各个设备的时间,对于运行在处理时间上的流程序, 所有的基于时间的操作(比如时间窗口)都是使用的设备时钟。比如, 一个窗口算子创建了一个长度为1小时的窗口,那么这个算子需要知道事件时间已经到达了这个窗口的关闭时间,从而在程序中去关闭这个窗口。例如,在程序中, 即使处理时间和事件时间有相同的速度, 事件时间可能会轻微的落后处理时间。另外一方面使用事件时间可以在几秒内处理已经缓存在Kafka中多周的数据,这些数据可以照样被正确处理, 就像实时发生的一样能够进入正确的窗口。

s_unbo的博客 834

第4章 Stata参数检验

目录 4.1单一样本T检验 案例延伸 4.2独立样本T检验 案例延伸 1.改变置信水平 2.在异方差假定条件下进行假设检验 4.3配对样本T检验 案例延伸 1.改变置信水平 4.4单一样本方差的假设检验 案例延伸 4.5双样本方差的假设检验 参数检验(Parameter Test)是指对参数的平均值、方差、比率等特征进行的统计检验。参数检验一般假设统计总体的具体分布为已知,但是其中一些参数或者取值范围不确定,分析的主要目的是估计这些未知参数的取值,或者对这些参数进...

qq_45112156的博客 1万+

Flink Watermark水印的工作原理及使用示例

水印是 Flink 中用来处理乱序事件的一种机制。水印是一种特殊的标记,它插入到数据流中,表示在这个时间点之前的所有事件都已经到达,或者至少可以假设它们已经到达。水印允许系统知道何时可以安全地进行窗口计算,因为所有预期的事件都已经被接收到了。

学亮编程手记 855

R 绘制环形树状图

按大类小类的从属关系绘制环形图,并把不同值的节点设置为相应大小。要求同一类的节点应为同一颜色。 按照输入,处理代码和输出记录

weixin_43718786的博客 1872

高通8155车机系统里,安卓和QNX是怎么‘打电话’的?聊聊HAB通信框架那些事

本文深入解析了高通8155车机系统中HAB通信框架如何实现安卓与QNX的高效协同。作为异构系统的通信桥梁,HAB通过共享内存和中断信号机制,在多媒体数据传输中展现出零拷贝、硬件加速等优势,成为智能座舱实现实时性与生态丰富性平衡的关键技术。

weixin_42715608的博客 381

Flink之水印(watermark)的补充理解

水印(Watermark)‌:用于==事件时间==处理,标记数据流的进度,解决乱序和延迟问题,触发窗口计算‌

我的博客 1912

基于STM32F4XX 、HAL库的GXHT30C温湿度传感器驱动应用C语言程序设计

define GXHT30C_STATUS_WRITE_CHK (1 << 0) // 写数据校验状态。#define GXHT30C_STATUS_HUMI_TRACK (1 << 11) // 湿度跟踪报警。#define GXHT30C_STATUS_TEMP_TRACK (1 << 10) // 温度跟踪报警。#define GXHT30C_STATUS_CMD_STATUS (1 << 1) // 命令执行状态。

PP_Cottage的博客 226

Flink-Watermark机制详解:(第39天)

Watermark机制,在Apache Flink这样的流处理框架中,扮演着至关重要的角色,特别是在处理事件时间(Event Time)窗口时,它能够有效解决数据乱序和延迟到达的问题,本文对Watermark机制的详细解析,涵盖其定义、原理、应用场景、核心算法以及优化策

syhiiu的博客 2487

AEJoy —— 最受欢迎的 5 个 Ae 表达方式

NOTE] 原文作者我意识到表达式可能令人生畏,有些人宁愿复制粘贴有用的代码,而不愿学习这门语言。对此我完全理解。因此,我想与您分享我的。这些是我几乎在每个项目中都会使用的表达式,我认为它们极大地提升了工作流程。

ShaderJoy 的兴趣技术杂货铺 362

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Flink 系列文章汇总索引

某一知识点,并辅以具体的示例进行说明。本专栏的文章编号可能不是顺序的,主要是因为写的时候顺序没统一,但相关的文章又引入了,所以后面就没有调整了,按照写文章的顺序进行编号。但一个专题的顺序号是统一的,不存在编号跳跃情况。

alanchanchn的专栏 7万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Flink之Watermark

Apache Flink 是一个分布式流处理框架,它非常擅长处理实时数据流。流处理中的一个关键挑战是事件时间的处理,因为在流式数据中,事件到达系统的顺序可能并不代表它们的实际发生时间。为了解决这一问题,Flink 引入了**Watermark(水印)**机制,用于处理乱序数据和保证事件时间的正确性。

youziguo的专栏 913

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Flink 时间属性及 WATERMARK 水印

水位线的生成是一个基于事件时间的机制,主要目的是处理乱序数据,确保窗口计算的准确性。通过设定一个最大延迟时间,水位线可以有效地处理乱序事件,并在适当的时间点触发窗口计算。

实践出真知 1603

Flink难点解析:揭开Watermark的神秘面纱

目录一、时间1.1 时间语义1.1.1 Event Time1.1.2 Ingestion Time1.1.3 Processing Time1.2 设置时间语义二、Watermark2.1 Watermark是什么?2.2 如何计算Watermark?2.3 何时出发窗口计算?2.4 原理2.4.1 窗口计算问题2.4.2 水印窗口2.5 Watermark设定策略2.5.1 AssignerWithPunctuatedWatermarks2.5.2 AssignerWithPeriodicWaterma

iflink 1734

Flink基础(五):WaterMark详解

一、WaterMark机制引入的背景 前面提到了Time的概念,如果我们使用Processing Time,那么在 Flink 消费数据的时候,它完全不需要关心的数据本身的时间,意思也就是说不需要关心数据到底是延迟数据还是乱序数据。因为 Processing Time 只是代表数据在 Flink 被处理时的时间,这个时间是顺序的。 但是如果你使用的是 Event Time 的话,那么你就不得不面临...

weixin_42155491的博客 3721

Flink中window 窗口和时间以及watermark水印

我们都知道,Flink的核心是流式处理,但同时也支持批处理,Flink底层是一个流式引擎,在这个上面实现了流处理和批处理,而窗口则是批处理的实现。 在Flink中window从大的分类上主要有三种:Time Window(根据时间)、Count Window(根据数据量)、Session Window(会话窗口) 窗口类型有如下两种: Tumbling Window 滚动窗口,窗口之间的数据没有重叠 Sliding Window 滑动窗口,窗口之间的数据有可能重叠 Count Window Count

LeoHan 1848

Flink Watermark 机制及总结

阐述 Flink 水印机制的原理和使用方式

cloudbigdata的博客 2618

【Flink原理介绍第一篇】:Flink WaterMark机制

如果您正在构建实时流媒体应用程序,则事件时间处理是您必须迟早使用的功能之一。由于在大多数现实世界的用例中,消息到达无序,应该有一些方法,您建立的系统了解消息可能迟到并且相应地处理的事实。在这篇博文中,我们将看到为什么我们需要事件时间处理,以及我们如何在ApacheFlink中启用它。 EventTime是事件在现实世界中发生的时间,ProcessingTime是Flink系统处理该事件的时间。要了...

hxcaifly的博客 4401

【白话Flink基础理论】Flink中的时间语义和水印WaterMark

——wirte by 橙心橙意橙续缘, 前言 白话系列 ———————————————————————————— 也就是我在写作时完全不考虑写作方面的约束,完全把自己学到的东西、以及理由和所思考的东西等等都用大白话诉说出来,这样能够让信息最大化的从自己脑子里输出并且输入到有需要的同学的脑中。PS:较为专业的地方还是会用专业口语诉说,大家放心! 白话Flink系列 ———————————————————————————— 主要是记录本人(国内某985研究生)在Flink基础理论阶段学习的一些所学,更重要的是一

橙心橙意橙续缘的博客 498

Flink水涨船高:EventTime和WaterMark

之前对于ProcessingTime,作为一种当前计算机的处理时间,我们不用在意它数据到来的顺序,一切以我当前计算机的时间为准,不用协调其他的计算机节点。 但是呢对于EventTime,拿我们Web网站的日志来说,EventTime即是日志中的时间戳,但是发送数据的情况不可能总是那么理想,到达Flink的顺序不可能刚好是时间戳的顺序,为了控制这种乱序的情况,引入了WaterMark,中文翻译暂时是...

weixin_43272605的博客 3万+

Flink Java 之 Watermark(触发原理, 使用)

实际开发中我们希望基于事件时间来处理数据,但因为数据可能因为网络延迟等原因,出现了乱序或延迟到达,那么可能处理的结果不是我们想要的甚至出现数据丢失的情况,所以需要一种机制来解决一定程度上的数据乱序或延迟到底的问题!也就Watermaker水印机制/水位线机制......

weixin_46376562的博客 928
上一篇: Flink 系列第5篇:Flink 窗口模型精讲(含实操代码)
下一篇: Flink 系列第7篇:Flink 状态管理全解析(原理+类型+存储+实操)
juniperhan
博客等级 码龄1年 132粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值