rakulang, dartlang, nimlang, golang, rustlang, lang lang no see

Event Time

焉知非鱼

Event Time

在本节中,您将学习如何编写时间感知(time-aware)的 Flink 程序。请看一下及时流处理,了解及时流处理背后的概念。

关于如何在 Flink 程序中使用时间的信息请参考 windowingProcessFunction

使用事件时间处理的先决条件是设置正确的时间特性(time characteristic)。该设置定义了数据流源的行为(例如,它们是否会分配时间戳),以及像 KeyedStream.timeWindow(Time.seconds(30)) 这样的窗口操作应该使用什么时间概念。

你可以使用 StreamExecutionEnvironment.setStreamTimeCharacteristic() 设置时间特性:

val env = StreamExecutionEnvironment.getExecutionEnvironment

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

val stream: DataStream[MyEvent] = env.addSource(new FlinkKafkaConsumer[MyEvent](topic, schema, props))

stream
    .keyBy( _.getUser )
    .timeWindow(Time.hours(1))
    .reduce( (a, b) => a.add(b) )
    .addSink(...)

需要注意的是,为了在事件时间(event time)中运行这个例子,程序需要使用直接为数据定义事件时间并自己发射水印的源,或者程序必须在源之后注入一个时间戳分配器(Timestamp Assigner)与水印生成器(Watermark Generator)。这些函数描述了如何访问事件时间戳,以及事件流表现出何种程度的无序性。

下一步该怎么走? #

  • 生成水印。展示了如何编写时间戳分配器和水印生成器,这些都是事件时间(event-time)感知 Flink 应用所需要的。
  • 内置的水印生成器。概述了内置的水印生成器。
  • 调试窗口和事件时间:展示如何调试事件时间 Flink 应用程序中围绕水印和时间戳的问题。