当前位置: 首页 > 知识库问答 >
问题:

kafka闪烁时间戳事件时间和水印

唐兴发
2023-03-14

我正在阅读《Stream Processing with Apache Flink》一书,书中说:“从版本0.10.0开始,Kafka支持消息时间戳。当从Kafka版本0.10或更高版本读取时,如果应用程序以事件时间模式运行,使用者将自动提取消息时间戳作为事件时间戳*“因此在ProcessElement函数中,调用context.timestamp()将默认返回Kafka消息时间戳?请提供一个简单的示例,说明如何实现AssignerWithPeriodicalWatermarks/AssignerWithPunctuatedWatermarks(基于消耗的kafka消息时间戳提取(和构建水印)。

如果我使用TimeCharacteristic.ProcessingTime,ctx.timestamp()是否返回处理时间,在这种情况下,它是否与Context.TimerService().CurrentProcessingTime()类似。

谢谢你。

共有1个答案

汪茂
2023-03-14

Flink Kafka consumer为您处理这件事,并将时间戳放在需要的地方。在Flink1.11中,您可以简单地依赖于此,尽管您仍然需要注意提供一个WatermarkStrategy来指定无序性(或断言时间戳是有序的):

java prettyprint-override">FlinkKafkaConsumer<String> myConsumer = new FlinkKafkaConsumer<>(...);
myConsumer.assignTimestampsAndWatermarks(
    WatermarkStrategy.
        .forBoundedOutOfOrderness(Duration.ofSeconds(20)));

在早期版本的Flink中,您必须提供一个时间戳分配器的实现,它看起来如下所示:

public long extractTimestamp(Long element, long previousElementTimestamp) {
    return previousElementTimestamp;
}

此版本的extracttimestamp方法传递的是StreamRecord中以PreviouSelementTimestamp的形式存在的时间戳的当前值,在本例中,该值将是Flink Kafka使用者放在那里的时间戳。

Flink 1.11文档
Flink 1.10文档

至于ctx.timestamp()在使用TimeCharacteristic.ProcessingTime时返回的内容,在这种情况下,此方法返回NULL。(语义上,是的,时间戳就好像是当前的处理时间,但这不是它的实现方式。)

 类似资料:
  • 我正在运行一个简单的示例来测试基于EventTime的Windows。我能够生成带有处理时间的输出,但当我使用EventTime时,没有输出。请帮助我明白我做错了什么。

  • 我正在处理来自物联网设备的事件流。 这些事件具有由网络设置的第一级时间戳。他们还将在不同时间点采取的多项措施组合在一起。例如: 网络时间9:08 度量值将按小时汇总,在这种情况下,M1应在8:00-9:00窗口中,M2应在9:00-10:00窗口中。 我想知道设计我的flink应用程序、管理这些时间戳和相关水印的正确方法是什么。根据我目前的理解: 我可能应该将所有与网络时间(9:08)相关的处理放

  • 我正在阅读Flink示例CountWithTimestamp,下面是该示例的代码片段: 我的问题是,如果我删除onTimer中的if语句(收集未触摸的stmt),而代之以processElement开头的另一个if语句

  • null 此窗口具有一个允许延迟为一分钟的BoundedOutoFordernesTimeStampExtractor。 水印:据我的理解,Flink和Spark结构化流中的水印定义为(max-event-timestamp-seen-so-far-alloged-lateness)。事件时间戳小于或等于此水印的任何事件都将被丢弃并在结果计算中忽略。 在此场景中,几个事件到达Flink运算符时具有

  • 我对Flink在事件时间上加水印时如何处理后期元素有些困惑。 现在我认识到这是一个微不足道的例子,但不理解这会使理解更复杂的流变得困难。

  • 我是Flink的新手,需要方法的帮助。我有时间颗粒度为5分钟的事件流。我想通过调用rest API来获取事件的元数据,其中包含过去1小时数据点的历史事件,即过去12点(5分钟时间颗粒度)。 e、 g事件的时间戳为10:00、10:05、10:10、10:15等,因此如果我想获取时间戳为11:00的事件元数据,我将调用send发送所有时间戳为10:00、10:05、10:10、10:15的事件。。1