flinkflink

Event Time

2018-01-20  本文已影响7人  小C菜鸟

原文链接


事件时间 /处理时间/摄入时间

Flink支持流操作中不同的时间概念。

设置时间特征

Flink DataStream程序第一部分通常是设置基本的时间特征。该设置定义了数据流Source的行为(例如,它们是否会分配时间戳),以及窗口操作(如KeyedStream.timeWindow(Time.seconds(30))所使用的时间概念。
下面的Flink示例程序每小时的时间窗口中聚合事件。窗口的行为适应时间特征。

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);

// alternatively:
// env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime);
// env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

DataStream<MyEvent> stream = env.addSource(new FlinkKafkaConsumer09<MyEvent>(topic, schema, props));

stream
    .keyBy( (event) -> event.getUser() )
    .timeWindow(Time.hours(1))
    .reduce( (a, b) -> a.add(b) )
    .addSink(...);

注意,为了使示例以事件时间运行,程序需要要么使用直接定义数据事件时间并自己发送水印的Source,要么程序必须在Source之后注入一个时间戳生成器与水印生成器。这些函数描述了如何访问事件时间戳和事件流展示的乱序的程度。
下面的部分描述了时间戳和水印背后的机制。Flink DataStream API中有关如何使用时间戳分配和水印生成的指南,请看Generating Timestamps / Watermarks

事件时间和水印

注意:Flink实现了Dataflow模型中的许多技术。要对事件时间和水印有一个很好的介绍,请看下面的文章。

支持事件时间的流处理器需要一种方法来度量事件时间的进度。例如,对于创建小时窗口的窗口操作符,当事件时间已经超过一个小时后需要通知该窗口操作符,以便操作符可以关闭处理中的窗口。

事件时间可以独立于处理时间(由壁钟测量)。例如,在一个程序中,操作符的当前事件时间可能会略滞后于处理时间(接收事件延迟而导致),然而两者都以相同的速度进行。另一方面,另一个流程序通过快速转发处理一些已经在Kafka主题(或另一个消息队列)中缓冲数周的历史数据,可能只需要几秒钟的处理。

在Flink中测量事件时间进度的机制是水印。水印携带一个时间戳t,并作为数据流的一部分。一个水印(t)宣称该流的事件时间已达t,这意味着该流中不应该再出现有元素的时间戳t ' < = t(即事件的时间戳大于或等于水印)。

下图显示了带有(逻辑)时间戳的事件流,以及内部流动的水印。在这个例子中,事件是有序的(基于它们的时间戳),这意味着水印只是流中的周期性标记。



水印对无序流至关重要,如下图所示,这些事件不是由它们的时间戳排序的。一般来说,水印是一种声明,即到流的此处,所有截止到指定时间戳的事件已经到达。一旦水印到达操作符,操作符可以将它内部的事件时钟更新到水印处。


并行流水印

水印是在源函数处或之后生成的。源函数的每个并行子任务通常独立地生成它的水印。这些水印定义了该特定并行源的事件时间。

当水印通过流程序时,它们会更新所到之处的操作符的事件时间。无论操作符什么时候更新它的事件时间,它会为它的后续操作符生成一个新的水印。

一些操作符消费多个输入流。例如union操作符,或者keyBy(…) 或 partition(…)函数之后的操作符。这样的操作符的当前事件时间是它的输入流的事件时间的最小值。当输入流更新它们的事件时间,操作符也会更新。

下图显示了事件和水印流经并行流,和操作符跟踪事件时间的示例。


延迟元素

一些元素可能会违背水印条件,这意味着即使是Watermark(t)之后生成的事件,一些元素的时间戳t ' <= t的情况也会发生。事实上,在真实世界的情况下,一些元素可以被任意延迟,从而无法指定一个时间,所有该事件时间戳之前的元素都已经生成。更进一步,即使延迟是有界的,延迟太多的水印也通常是不需要的,因为它会导致对事件时间窗口的评估延迟太多。

基于这个原因,流程序可能会明确的期望一些延迟元素。延迟元素是在系统事件时钟(由水印发出信号)之后到达的元素,且该时钟已经超过了延迟元素的时间戳。更多关于在事件时间窗口中如何处理延迟元素的信息参见Allowed Lateness

水印调试

请参阅调试窗口和事件时间部分,以便在运行时调试水印。

上一篇 下一篇

猜你喜欢

热点阅读