40、Flink 的窗口延迟数据处理(Allowed Lateness)详解

Allowed Lateness
a)概述

在使用 event-time 窗口时,数据可能会迟到,即 Flink 用来追踪 event-time 进展的 watermark 已经越过了窗口结束的 timestamp 后,数据才到达。

默认,watermark 一旦越过窗口结束的 timestamp,迟到的数据就会被直接丢弃;但是 Flink 允许指定窗口算子最大的 allowed lateness ,Allowed lateness 定义了一个元素可以在迟到多长时间的情况下不被丢弃,这个参数默认是 0,在 watermark 超过窗口末端、到达窗口末端加上 allowed lateness 之前的这段时间内到达的元素,依旧会被加入窗口;取决于窗口的 trigger,一个迟到但没有被丢弃的元素可能会再次触发窗口,比如 EventTimeTrigger

为了实现这个功能,Flink 会将窗口状态保存到 allowed lateness 超时才会将窗口及其状态删除 。

默认,allowed lateness 被设为 0,即 watermark 之后到达的元素会被丢弃。

复制代码
DataStream<T> input = ...;

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .allowedLateness(<time>)
    .<windowed transformation>(<window function>);

使用 GlobalWindows 时,没有数据会被视作迟到,因为全局窗口的结束 timestamp 是 Long.MAX_VALUE

b)从旁路输出(side output)获取迟到数据

通过 Flink 的 旁路输出 功能,可以获得迟到数据的数据流。

首先,需要在开窗后的 stream 上使用 sideOutputLateData(OutputTag) 表明需要获取迟到数据;然后,就可以从窗口操作的结果中获取旁路输出流了。

复制代码
final OutputTag<T> lateOutputTag = new OutputTag<T>("late-data"){};

DataStream<T> input = ...;

SingleOutputStreamOperator<T> result = input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .allowedLateness(<time>)
    .sideOutputLateData(lateOutputTag)
    .<windowed transformation>(<window function>);

DataStream<T> lateStream = result.getSideOutput(lateOutputTag);
c)注意

当指定了大于 0 的 allowed lateness 时,窗口本身以及其中的内容仍会在 watermark 越过窗口末端后保留。 这时,如果一个迟到但未被丢弃的数据到达,它可能会再次触发这个窗口,这种触发被称作 late firing,与表示第一次触发窗口的 main firing 相区别。

如果是使用会话窗口的情况,late firing 可能会进一步合并已有的窗口,因为他们可能会连接现有的、未被合并的窗口。

late firing 发出的元素应该被视作对之前计算结果的更新,即你的数据流中会包含一个相同计算任务的多个结果,应用需要考虑到这些重复的结果,或去除重复的部分。

相关推荐
wdfk_prog24 分钟前
解决 `git cherry-pick` 引入大量新文件的问题
大数据·git·elasticsearch
洛阳纸贵1 小时前
JAVA高级工程师--Elasticsearch
大数据·elasticsearch·搜索引擎
TracyCoder1231 小时前
ElasticSearch内存管理与操作系统(二):深入解析 Circuit Breakers(熔断器)机制
大数据·elasticsearch·搜索引擎
外参财观2 小时前
从浏览器到“超级眼”:夸克的突围战
大数据
BYSJMG3 小时前
计算机毕设选题推荐:基于大数据的癌症数据分析与可视化系统
大数据·vue.js·python·数据挖掘·数据分析·课程设计
petrel20153 小时前
【Spark 核心内参】2026.1:JIRA vs GitHub Issues 治理模式大讨论与 4.2.0 预览版首发
大数据·spark
闻哥3 小时前
深入理解 ES 词库与 Lucene 倒排索引底层实现
java·大数据·jvm·elasticsearch·面试·springboot·lucene
TracyCoder1234 小时前
全面解析:Elasticsearch 性能优化指南
大数据·elasticsearch·性能优化
bigdata-rookie4 小时前
Starrocks 简介
大数据·数据库·数据仓库
petrel20154 小时前
【Spark 核心内参】2025.9:预览版常态化与数据类型的重构
大数据·spark