Event Time
— 焉知非鱼Event Time
Event Time #
在本节中,您将学习如何编写时间感知(time-aware)的 Flink 程序。请看一下及时流处理,了解及时流处理背后的概念。
关于如何在 Flink 程序中使用时间的信息请参考 windowing 和 ProcessFunction。
使用事件时间处理的先决条件是设置正确的时间特性(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)。这些函数描述了如何访问事件时间戳,以及事件流表现出何种程度的无序性。