事件时间的推进
上游发过来的数据总是乱序的,有早有晚,然而有些动作是必须要明确的标记触发的,比如窗口计算。
那么,此时就需要一个水位线来推进事件时间
比如,系统最大时间-时间间隔
java
stream.assignTimestampsAndWatermarks(
WatermarkStrategy
.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(10))
.withTimestampAssigner((event, ts) -> event.getEventTime())
);
表示系统允许最大乱序为 10 秒。
-
Flink 在内部生成 Watermark 的公式为:Watermark = 当前观察到的最大事件时间 - 10 秒
-
只要比这个 Watermark 更早的事件,就被认为是"已经延迟太久"的数据,可能被丢弃或作为迟到数据处理。
多流操作的协同
双流 Join 的完整性保证:在双流 join或 coProcessFunction中,Watermark 用于对齐两个流的事件时间。例如:
- 流 A 的 Watermark = 10:05
- 流 B 的 Watermark = 10:00
下游算子以 min(10:05, 10:00) = 10:00作为当前 Watermark,确保仅当两流数据均推进到 10:00后才输出匹配结果,避免数据丢失 。
乱序数据处理:通过取各输入流的最小 Watermark,确保慢速流的数据不被快速流覆盖