事件时间

本节你将学到如何写可感知时间变化的 Flink 程序,可以先看看实时流处理了解相关概念。

想了解如何在 Flink 程序中使用时间特性,请参阅窗口处理函数

使用事件时间进行流处理的先决条件是设置合适的时间特性,该设置定义了数据流的行为方式(例如,是否分配时间戳),以及窗口算子使用哪种时间概念,例如 KeyedStream.timeWindow(Time.seconds(30))

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

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

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

stream
    .keyBy( (event) -> event.getUser() )
    .timeWindow(Time.hours(1))
    .reduce( (a, b) -> a.add(b) )
    .addSink(...);
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(...)
env = StreamExecutionEnvironment.get_execution_environment()

env.set_stream_time_characteristic(TimeCharacteristic.EventTime)

# alternatively:
# env.set_stream_time_characteristic(TimeCharacteristic.IngestionTime)
# env.set_stream_time_characteristic(TimeCharacteristic.ProcessingTime)

值得注意的是,为了能够使用事件时间作为时间特征运行此示例,程序需要使用那些能给数据直接定义事件时间并自己发出水印的源,或者程序必须在收到源发出的事件流之后注入“时间戳分配器和水印生成器”,这些功能描述了访问事件时间戳的方法,以及事件流呈现的乱序程度。

接下来看什么?

  • 生成水印:描述了在写可感知事件时间的 Flink 应用程序时,如何定义时间戳分配器和水印生成器。
  • 内置水印生成器:概述了 Flink 自带的水印生成器。
  • 调试窗口&事件时间:描述了在可感知事件时间的 Flink 应用程序里,如何调试水印和时间戳。

Back to top