WatermarkGenerator#onEvent 的方法签名中的 eventTimestamp 似乎是多余的
the eventTimestamp in the method signature of WatermarkGenerator#onEvent seems redundant
下面是WatermarkGenerator
,
的定义
@Public
public interface WatermarkGenerator<T> {
/**
* Called for every event, allows the watermark generator to examine and remember the
* event timestamps, or to emit a watermark based on the event itself.
*/
void onEvent(T event, long eventTimestamp, WatermarkOutput output);
/**
* Called periodically, and might emit a new watermark, or not.
*
* <p>The interval in which this method is called and Watermarks are generated
* depends on {@link ExecutionConfig#getAutoWatermarkInterval()}.
*/
void onPeriodicEmit(WatermarkOutput output);
}
对于onEvent
方法,为什么方法签名中有一个多余的参数long eventTimestamp
,我想事件时间应该可以从T event
中提取出来(具体的事件类型应该带有事件时间),并且应该等于eventTimestamp,所以我想问为什么需要这个冗余参数long eventTimestamp
因为我可以从事件中得到它,这里的设计考虑是什么?
我认为逻辑是 WatermarkGenerator
不对事件时间的来源做出任何假设。
一个典型的案例确实是,作为开发人员,我们提前 TimestampAssigner
提供了几个步骤来从每个事件中提取事件时间。即使在这种情况下,也可能不希望在 WatermarkGenerator
中重复此类逻辑,以避免耦合,尤其是当该过程涉及的不仅仅是读取单个字段时。所以这是在这里提供它的第一个动机。
另一种典型情况是事件时间由数据源自己提供,独立于每个事件中的任何字段。例如,可以选择使用 Kafka 连接器就是这样一种方式,让它从 kafka 时间戳元数据中获取事件时间,独立于事件负载。
传递给 onEvent
方法的时间戳是 StreamRecord
封装您的事件的信封中的当前时间戳。这是之前分配给此事件的任何时间戳——例如,在 Kafka 的情况下,这可能是 Kafka 记录中时间戳的值 header.
虽然这通常是冗余信息,但在某些情况下,访问先前分配给上游的时间戳很有用。
下面是WatermarkGenerator
,
@Public
public interface WatermarkGenerator<T> {
/**
* Called for every event, allows the watermark generator to examine and remember the
* event timestamps, or to emit a watermark based on the event itself.
*/
void onEvent(T event, long eventTimestamp, WatermarkOutput output);
/**
* Called periodically, and might emit a new watermark, or not.
*
* <p>The interval in which this method is called and Watermarks are generated
* depends on {@link ExecutionConfig#getAutoWatermarkInterval()}.
*/
void onPeriodicEmit(WatermarkOutput output);
}
对于onEvent
方法,为什么方法签名中有一个多余的参数long eventTimestamp
,我想事件时间应该可以从T event
中提取出来(具体的事件类型应该带有事件时间),并且应该等于eventTimestamp,所以我想问为什么需要这个冗余参数long eventTimestamp
因为我可以从事件中得到它,这里的设计考虑是什么?
我认为逻辑是 WatermarkGenerator
不对事件时间的来源做出任何假设。
一个典型的案例确实是,作为开发人员,我们提前 TimestampAssigner
提供了几个步骤来从每个事件中提取事件时间。即使在这种情况下,也可能不希望在 WatermarkGenerator
中重复此类逻辑,以避免耦合,尤其是当该过程涉及的不仅仅是读取单个字段时。所以这是在这里提供它的第一个动机。
另一种典型情况是事件时间由数据源自己提供,独立于每个事件中的任何字段。例如,可以选择使用 Kafka 连接器就是这样一种方式,让它从 kafka 时间戳元数据中获取事件时间,独立于事件负载。
传递给 onEvent
方法的时间戳是 StreamRecord
封装您的事件的信封中的当前时间戳。这是之前分配给此事件的任何时间戳——例如,在 Kafka 的情况下,这可能是 Kafka 记录中时间戳的值 header.
虽然这通常是冗余信息,但在某些情况下,访问先前分配给上游的时间戳很有用。