flink设置watermark以及事件时间字段源码分析

本文深入分析Flink中设置watermark和事件时间字段的源码,介绍了TimestampAssigner接口及其核心实现,如AscendingTimestampExtractor和BoundedOutOfOrdernessTimestampExtractor。讲解了如何通过assignTimestampsAndWatermarks方法设置时间戳和watermark,以及不同实现类的工作原理,如乱序数据的处理和watermark的生成策略。总结了watermark在窗口计算中的作用和重要性。
摘要由CSDN通过智能技术生成

flink设置watermark以及事件时间字段源码分析

背景

1.1、提取时间戳字段,用于事件时间语义处理数据

1.2、设置水位线(水印)watermark

TimestampAssigner 核心接口介绍

TimestampAssigner 时间分配器接口 实现类关系图:

在这里插入图片描述

提取时间戳字段方法

TimestampAssigner 时间戳分配器, 提取数据流中的时间戳字段,

public interface TimestampAssigner<T> extends Function {
   

	/**
	 * Assigns a timestamp to an element, in milliseconds since the Epoch.
	 *
	 * <p>The method is passed the previously assigned timestamp of the element.
	 * That previous timestamp may have been assigned from a previous assigner,
	 * by ingestion time. If the element did not carry a timestamp before, this value is
	 * {@code Long.MIN_VALUE}.
	 *
	 * @param element The element that the timestamp will be assigned to.
	 * @param previousElementTimestamp The previous internal timestamp of the element,
	 *                                 or a negative value, if no timestamp has been assigned yet.
	 * @return The new timestamp.
	 */
	long extractTimestamp(T element, long previousElementTimestamp);
}

TimestampAssigner 实现类

AssignerWithPeriodicWatermarks  //周期性的生成水印
AssignerWithPunctuatedWatermarks //打断式的生成,也就是可以每一条数据都生成
BoundedOutOfOrdernessTimestampExtractor //乱序数据周期性生成
AscendingTimestampExtractor //升序数据周期性生成
IngestionTimeExtractor  //进入flink系统时间分配器

设置时间戳、水印方法

DataStream类设置时间戳的方法:assignTimestampsAndWatermarks,指定watermark

	public SingleOutputStreamOperator<T> assignTimestampsAndWatermarks(
			AssignerWithPeriodicWatermarks<T> timestampAndWatermarkAssigner) {
   

		// match parallelism to input, otherwise dop=1 sources could lead to some strange
		// behaviour: the watermark will creep along very slowly because the elements
		// from the source go to each extraction operator round robin.
		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);
	}


1、AssignerWithPeriodicWatermarks接口:

public interface AssignerWithPeriodicWatermarks<T
Flink中,Watermark是用于处理事件时间的机制,用于表示事件时间进展到了哪个时间点。Watermark的生成需要一个Watermark Generator,而Watermark Generator又由Timestamp Assigner和Watermark Generator两部分组成。 具体来说,Timestamp Assigner用于从数据中提取事件时间,而Watermark Generator则用于根据事件时间生成WatermarkWatermark Generator有两种生成方式:基于数据的Timestamp Assigner和基于时间Watermark Generator。 在Flink中,可以通过实现WatermarkGenerator接口来自定义Watermark Generator。WatermarkGenerator接口中有两个方法:onEvent和onPeriodicEmit。onEvent方法会在每个事件到达时被调用,用于更新Watermark,而onPeriodicEmit方法会周期性地触发,用于生成Watermark。 下面是一个示例代码,演示如何在Flink设置Watermark: ```java public class MyWatermarkGenerator implements WatermarkGenerator<MyEvent> { private long maxTimestamp = Long.MIN_VALUE; @Override public void onEvent(MyEvent event, long eventTimestamp, WatermarkOutput output) { // 更新maxTimestamp maxTimestamp = Math.max(maxTimestamp, eventTimestamp); } @Override public void onPeriodicEmit(WatermarkOutput output) { // 生成Watermark output.emitWatermark(new Watermark(maxTimestamp - 5000)); } } ``` 在上面的代码中,我们实现了WatermarkGenerator接口,并重写了onEvent和onPeriodicEmit方法。在onEvent方法中,我们更新了maxTimestamp,而在onPeriodicEmit方法中,我们生成了Watermark,并通过output.emitWatermark方法将其发送出去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值