如何正确理解flink 消费kafka时的watermark

案例1

在source 层面用全量数据watermark 对后面的窗口计算是否有影响?

bash 复制代码
KafkaSource<Event> source = KafkaSource.<Event>builder()
    .setWatermarkStrategy(
        WatermarkStrategy
            .forBoundedOutOfOrderness(Duration.ofSeconds(5))
            .withTimestampAssigner(e -> e.eventTime)
    )  // 全量WM:order+click污染!
    .build();

tream.filter(e -> e.type.equals("order"))  
    .window(...).sum();  

tream.filter(e -> e.type.equals("click"))  
    .window(...).sum();  
分析

10s(order) → 12s(click) → 15s(order) → 18s(click) → 20s(order)

全是数据生成的watermark是20-5=15

order 数据生成的watermark是 20-5=15

click 数据生成的watermark是 18-5=13

假设窗口大小是10s,现在又来了一条数据25s(order)

这里会导致窗口生成的watermark是25-5=20,刚好可以触发窗口计算了,可实际上可click这个数据流还有部分数据未到达,比如19(click) 就会漏算。所以这样生成watermark会有问题

案例2

上面的问题可以通过filter 精确分流,然后再生成watermark

bash 复制代码
public class WatermarkMasterTemplate {
    public static void main(String[] args) {
        // 1. Source:无WM(零污染)
        KafkaSource<Event> source = KafkaSource.builder()
            .build();
        
        // 2. 业务分流 + 独立WM(最精确)
        stream.filter(e -> e.type.equals("order"))
            .assignTimestampsAndWatermarks(preciseWM("order"))
            .window(...).print("ORDER");
            
        stream.filter(e -> e.type.equals("click")) 
            .assignTimestampsAndWatermarks(preciseWM("click"))
            .window(...).print("CLICK");
    }
    
    static WatermarkStrategy<Event> preciseWM(String type) {
        return WatermarkStrategy
            .forBoundedOutOfOrderness(Duration.ofSeconds(5))
            .withTimestampAssigner(e -> e.eventTime);
    }
}
分析

10s(order) → 12s(click) → 15s(order) → 18s(click) → 20s(order)

order 数据生成的watermark是 20-5=15

click 数据生成的watermark是 18-5=13

这样不同流生成的watemark 生成的流是精确的

案例3

如果先加一个rebance 操作,是否会影响per-partition watermark 语义

bash 复制代码
public class WatermarkMasterTemplate {
    public static void main(String[] args) {
        // 1. Source:无WM(零污染)
        KafkaSource<Event> source = KafkaSource.builder()
            .build();
      source.stream()
            .rebalance()
            .assignTimestampsAndWatermarks(preciseWM("order"))
            .window(...)
            .sum()
            .print("ORDER");
    }
    
    static WatermarkStrategy<Event> preciseWM(String type) {
        return WatermarkStrategy
            .forBoundedOutOfOrderness(Duration.ofSeconds(5))
            .withTimestampAssigner(e -> e.eventTime);
    }
}
分析

分区

partition a 10s(order) → 11s(click) → 14s(order) → 16s(click) → 18s(order)

partition b 12s(order) → 13s(click) → 15s(order) → 17s(click) → 19s(order)

但是如果是这样rebalance的话,会打乱单分区的watermark 的递增性,导致watermark 生成不精确

相关推荐
java1234_小锋8 小时前
【免费】基于Spark实时医疗健康数据监测与疾病预测系统(Java版本+可视化大屏+Kafka+SpringBoot+Vue3) 锋哥原创出品,必属精品
大数据·spark·kafka·实时医疗健康数据监测·实时疾病预测系统
Flink_China1 天前
Flink OSS CDC: 让AI多模态数据处理实时化
flink
菜地里的小菜鸟1 天前
k8s部署单节点 Kafka(KRaft 模式)并启用 SASL 认证
kafka·kraft·k8s部署单节点kafkakraft模式·k8s部署kafka
Volunteer Technology1 天前
Kafka的消费全流程
分布式·kafka·linq
篮框坏了1 天前
Kafka 消费者卡死排查:一个 topic 堵了 18 小时,监控全绿没人发现
kafka
放学-别走1 天前
flink和kafka常见面试题
大数据·flink·kafka
阿里云大数据AI技术2 天前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
java1234_小锋2 天前
【免费】基于Spark实时交通流量分析与拥堵预测系统(Java版本+可视化大屏+Kafka+SpringBoot+Vue3) 锋哥原创出品,必属精品
java·大数据·spark·kafka·实时交通流量分析与拥堵预测
敲个大西瓜2 天前
Kafka一百道核心面试题
kafka
后端观测站2 天前
第三篇:消息队列如何保证消息可靠性?
kafka·java-rocketmq