首页/数据/数据工程与 ETL 速查/迟到数据处理 Late Data
管道基础52 条

迟到数据处理 Late Data

迟到数据是事件时间早于当前水位线的记录。常见处理:允许窗口内继续更新、旁路输出离线补偿、或在下游做覆盖合并。

迟到数据是什么

流计算按事件时间开窗时,需要用水位线(watermark)判断「这个窗口的数据大致齐了」。当一条记录的事件时间早于当前水位线,它就被判为迟到数据。迟到本身不是错误:网络抖动、客户端离线补传、上游批任务回灌历史都会造成迟到,关键在于窗口触发之后这些记录还能不能被计入。

基本信息

判定记录事件时间早于已发出的水位线
来源网络抖动、客户端补传、上游批转流
手段延长水位线、允许迟到窗口、侧输出补偿
适用引擎Flink、Spark Structured Streaming 等事件时间语义引擎
前提必须显式声明事件时间列与水位线,否则不存在迟到概念

策略对照

策略对照
允许迟到(allowed lateness):窗口延迟销毁,迟到数据仍触发更新
侧输出(side output):迟到记录单独落地,离线任务补算
直接丢弃:仅适用于近似监控,对账类指标不可接受

三种处理方式对比

方式适用代价
allowed lateness指标允许回改,下游支持更新写窗口状态保留更久,内存与 checkpoint 变大
侧输出补救需要精确结果但实时性可让步多一条离线补偿链路,要保证补偿幂等
直接丢弃监控、大屏等近似场景累计值偏低,不能用于对账

典型使用场景

  • 实时参考链路可接受少量迟到,配置几秒到几分钟的容忍窗口
  • 财务对账链路建议以离线批处理为准,实时结果只做预警
  • 迟到率要纳入监控指标,突增往往是上游故障或时钟漂移的信号
  • 移动端埋点补传场景要按设备时钟校准,避免整批数据被判定为迟到
水位线是「容忍度」也是「延迟」,放宽水位线会同时推迟所有窗口的首次输出;实际调参时要按业务对时效与准确的取舍来定,而不是一律调到最宽。

易错点

  • 把迟到数据 UPDATE 进天级汇总表可能覆盖其他分区的累计值,要先读后写并锁定分区
  • 迟到率突增常是上游采集延迟的信号,要当事件处理而不是常态
  • 只放宽水位线不设 allowed lateness,窗口照样在触发后关闭,迟到数据仍旧丢失
  • 上游时钟不同步会产生大量「假迟到」,应先校准 NTP 再调参数

数据来源与参考

  • Apache Flink 官方文档:Allowed Lateness 与 Side Outputs
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌