flink对于迟到数据的处理

Flink 对迟到数据的处理主要通过以下机制实现:

waterMark和Window机制解决了流式数据的乱序问题,对于因为延迟而顺序有误的数据,可以根据eventTime进行业务处理,对于延迟的数据Flink也有自己的解决办法,

主要的办法是给定一个允许延迟的时间,在该时间范围内仍可以接受处理延迟数据

设置允许延迟的时间是通过allowedLateness(lateness: Time)设置

保存延迟数据则是通过sideOutputLateData(outputTag: OutputTagT)保存

获取延迟数据是通过DataStream.getSideOutput(tag: OutputTagX)获取

1. 允许延迟(Allowed Lateness)

通过 allowedLateness 设置窗口关闭后的容忍时间。在此时间内到达的数据仍可触发窗口计算:

复制代码
windowedStream
    .allowedLateness(Duration.ofMinutes(5))
    .reduce(new MyReduceFunction());

2. 侧输出(Side Output)

超过容忍时间的数据可通过侧输出捕获:

复制代码
OutputTag<T> lateDataTag = new OutputTag<>("late-data");
WindowedStream<T> windowed = input
    .keyBy(...)
    .window(...)
    .allowedLateness(...)
    .sideOutputLateData(lateDataTag);

DataStream<T> lateStream = windowed.getSideOutput(lateDataTag);

3. 水位线(Watermark)机制

水位线标记事件时间进度,其生成策略(如 BoundedOutOfOrderness)直接影响延迟容忍度:

复制代码
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
env.getConfig().setAutoWatermarkInterval(1000);

DataStream<T> withTimestamps = input
    .assignTimestampsAndWatermarks(
        new BoundedOutOfOrdernessTimestampExtractor<T>(Duration.ofSeconds(10)) {
            @Override
            public long extractTimestamp(T element) {
                return element.getEventTime();
            }
        });

4. 窗口状态清理

窗口触发后状态默认保留至 allowedLateness 结束,需注意避免状态无限增长:

复制代码
windowedStream
    .trigger(new MyTrigger()) // 自定义触发器
    .evictor(new MyEvictor()); // 自定义清理器

处理流程示例

复制代码
1. 水位线推进至窗口结束时间
2. 窗口初次计算结果输出
3. 允许延迟期内新数据触发更新计算
4. 延迟期结束后:
   - 侧输出捕获迟到数据
   - 清除窗口状态

注意事项

  • 容忍时间过长可能导致状态存储压力
  • 侧输出数据需单独定义处理逻辑
  • 事件时间与处理时间需明确区分

通过组合水位线、允许延迟和侧输出机制,Flink 实现了对乱序数据的鲁棒性处理,保障计算结果的准确性。

相关推荐
To_OC7 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny8 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹8 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny8 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
To_OC9 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn9 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker9 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜9 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康10 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端