Flink 时间语意
- flink 中的时间语意
- 设置Event Time
- Watermark
- watermark的传递,引入和设定
- Event Time:时间创建的时间
- Ingestion Time:数据进入flink的时间
- Processing Time:执行操作算子的本地系统时间,与机器相关
不同的时间语义有不同的应用场合
我们往往更关心事件时间(Event Time)
某些应用场合,不应该使用Processing Time
Event Time 可以从日志数据的时间戳(timestamp)中提取
代码设置Event Time
- 在代码中,对执行环境调用setStreamTimeCharacteristic方法,设置流的时间特性。
- 具体的时间,还需要从数据中提取时间戳(timestamp)
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// In Flink 1.12 the default stream time characteristic has been changed to {@link TimeCharacteristic#EventTime}
// flink 1.12 中EventTime 已经是默认strearm time
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
乱序数据影响
- 当flink以Event Time模式处理数据流时,他会根据数据里的时间戳来处理基于时间的算子
- 由于网络,分布式等原因,会导致乱序数据的产生。
- 乱序数据会让窗口计算不准确
Watermark
怎样避免乱序数据带来计算不正确?
遇到一个时间戳达到了窗口关闭时间,不应该立刻触发窗口计算,而是等待一段时间,等迟到的数据来了再关闭窗口
-
watermark是一种衡量Event Time进展的机制,可以设定延迟触发
-
watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用watermark机制结合window来实现
-
数据流中的watermark用于表示timestamp小于watermark的数据,都已经到达了,因此,window的执行也是由watermark触发的。
-
watermark用来让程序自己平衡延迟和结果正确性
watermark特点
- watermark是一条特殊的数据记录
- watermark必须单调递增,以确保任务的事件时间时钟在向前推进,而不是在后退
- watermark与数据的时间戳相关
watermark的传递
上游到下游传递,是广播出去。保证最小watermark数据到齐。
watermark的引入
-
Event Time的使用一定要指定数据源中的时间戳
BoundedOutOfOrdernessTimestampExtractor,就可以指定watermark
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// In Flink 1.12 the default stream time characteristic has been changed to {@link TimeCharacteristic#EventTime}
// flink 1.12 中EventTime 已经是默认strearm time
env.setParallelism(1);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); // 设置流时间特性
// 设置watermark周期性生成的时间间隔
env.getConfig().setAutoWatermarkInterval(200);
//DataStream<String> filedata = env.readTextFile("data/temps.txt");
DataStream<String> localhost = env.socketTextStream("localhost", 7777);
DataStream<TempInfo> dataStream = localhost.map(new MapFunction<String, TempInfo>() {
@Override
public TempInfo map(String value) throws Exception {
String[] split = value.split(",");
return new TempInfo