快速用源码了解Flink的watermark 及Idle

本文详细探讨了Flink中的Watermark概念及其作用,它作为流处理中的时间戳参考,确保处理进度。同时,文章阐述了Watermark的来源,特别是在数据源分区暂停时的处理策略。此外,还介绍了Idle的好处,如如何处理多个数据分区和避免整体Watermark停滞。通过设置Idle,可以确保即使某些分区停止产生数据,整体处理也能继续推进。最后,建议在数据源后添加.withIdleness()来自动检测并处理Idle状态。
摘要由CSDN通过智能技术生成

快速用源码了解Flink的watermark及Idle

先回答两个问题
WaterMark(以下用wm 表示)的定义是什么,启到了什么作用?
根据wm的策略,产生 eventTimeStamp的wm 或systemTimeStamp 的wm。主要用来表征,数据流现在处理的数据到了哪儿。wm特征是一直递增,为流处理的触发启到一个参照物的作用。

wm 是从哪里产生的,如果数据源部分分区停了怎么办?
下游任务面对多个数据源分区是怎么获得wm。
wm 如果说是eventTime 产生的,那么数据源就是其产生的源头。数据源分区停了,分两种情况,第一种,该数据分区一开始就没有数据,从kafkaSource中可以看到
第二种在下游任务,在讲解Idle中体现。

//这里是 FlinkKafkaConsumerBase ,用来获取kafka 分区信息,如果所处的分区没有或没有数据,就将数据源表示为Idle。
if (subscribedPartitionsToStartOffsets.isEmpty()) {
   
            sourceContext.markAsTemporarilyIdle();
        }

Idle 的好处在于,
1.如果数据源的Task,需要处理多个数据分区
若,其中某个分区设置了Idle,就不在理会该分区的wm,而是从其它分区 轮询的找最小的wm。

//在CombinedWatermarkStatus 类中,明显可以看到,
//PartialWatermark 是分区的wm,
//如果PartialWatermark 没有设置Idle,则可以参与整体wm的选取。
//如果PartialWatermark 的分区没有数据,且没有设置Idle。会导致wm不再更新,因为是轮询找分区中最小的wm
 public boolean updateCombinedWatermark() {
   
        long minimumOverAllOutputs = Long.MAX_VALUE;

        boolean hasOutputs = false;
        boolean allIdle = true;
        for 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值