Flink源码解析:watermark生成与传递

本文详细探讨了Flink的watermark生成策略,包括周期性和特定标记生成,并重点讲解了AssignerWithPeriodicWatermarks的使用。接着,文章剖析了watermark的处理流程,涉及chainingOutput和RecordWriteOutput两种情况,以及watermark如何在task间传递并触发时间窗口的计算。内容深入浅出,有助于理解Flink的时间处理机制。
摘要由CSDN通过智能技术生成

前一部分内容转载自其他文章

watermark生成

watermark的生成策略有两种:一种是周期性生成,另外一种是根据特定标记生成。在实际使用中大多数情况下会选择周期性生成方式也就是AssignerWithPeriodicWatermarks方式,使用方式如下:

// An highlighted block
//指定为evenTime时间语义
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//生成watermark的周期
env.getConfig.setAutoWatermarkInterval(watermarkInterval)
//指定方式
dataStream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[Element](Time.seconds(allowDealy)) {
   
   override def extractTimestamp(element: Element): Long = element.dT
  })

BoundedOutOfOrdernessTimestampExtractor 是Flink内置提供的允许乱序最大延时的watermark生成方式,只需要重写其extractTimestamp方法即可。

assignTimestampsAndWatermarks 可以理解为是一个算子转换操作,等同于map/window一样理解,可以为其设置并行度、名称,也是一个transformation/operator,

// An highlighted block
public SingleOutputStreamOperator<T> assignTimestampsAndWatermarks(
      AssignerWithPeriodicWatermarks<T> timestampAndWatermarkAssigner) {
   
       final int inputParallelism = getTransformation().getParallelism();
    final AssignerWithPeriodicWatermarks<T> cleanedAssigner =   clean(timestampAndWatermarkAssigner);
 
    TimestampsAndPeriodicWatermarksOperator<T> operator =
        new TimestampsAndPeriodicWatermarksOperator<>(cleanedAssigner);
    return transform("Timestamps/Watermarks", getTransformation().getOutputType(), operator)
        .setParallelism(inputParallelism);
  }

在生成的jobGraph中,也是作为其中的一部分:

默认的名称就是 Timestamps/Watermarks。

接下来深入分析其使用的StreamOperator类型TimestampsAndPeriodicWatermarksOperator,其继承了AbstractUdfStreamOperator,实现了OneInputStreamOperator接口与ProcessingTimeCallback接口,具体包含的方法:

open方法:

// An highlighted block
public void open() throws Exception {
   
    super.open();
    //初始化默认当前watermark
    currentWatermark = Long.MIN_VALUE;
    //生成watermark周期时间配置
    watermarkInterval = getExecutionConfig().getAutoWatermarkInterval();
    //注册定时其配置
    if (watermarkInterval > 0) {
   
      long now = getProcessingTimeService().getCurrentProcessingTime();
      getProcessingTimeService().registerTimer(now + watermarkInterval, this);
    }
  }

最重要的就是getProcessingTimeService().registerTimer

注册一个watermarkInterval后触发的定时器,传入回调参数是this,也就是会调用当前对象的onProcessingTime方法(关于这部分知识可以查看Flink的定时系列)。

processElement方法:

// An highlighted block
public void processElement(StreamRecord<T> element) throws Exception 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值