在 Apache Flink 中,时间在流处理中是一个重要的概念,而时间语义则用于定义事件发生的时间。Flink 支持三种时间语义,分别是:
// 示例:在 Flink 程序中使用处理时间
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<MyEvent> stream = env.addSource(new MyEventSource());
stream
.keyBy(MyEvent::getKey)
.timeWindow(Time.seconds(10))
.process(new MyProcessWindowFunction());
// 示例:在 Flink 程序中使用事件时间
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<MyEvent> stream = env.addSource(new MyEventSource());
stream
.assignTimestampsAndWatermarks(new MyTimestampExtractor())
.keyBy(MyEvent::getKey)
.timeWindow(Time.seconds(10))
.process(new MyProcessWindowFunction());
// 示例:在 Flink 程序中使用摄入时间
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<MyEvent> stream = env.addSource(new MyEventSource());
stream
.assignTimestampsAndWatermarks(new IngestionTimeExtractor())
.keyBy(MyEvent::getKey)
.timeWindow(Time.seconds(10))
.process(new MyProcessWindowFunction());
在 Flink 中,可以通过 StreamExecutionEnvironment 的 setStreamTimeCharacteristic() 方法来设置时间语义。例如:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);