快速用源码了解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