什么是时间语义
flink 是基于流式的数据处理框架。
既然是流式,那么就会有事件到来,并由框架处理,这样的一系列流程
image.png
就像上图一样用户或者上游系统产生事件,通过发送消息这样的方式,经由消息队列传输到flink集群里。
我们就可以从这里归纳出一个事件在被创建到被处理,这一个流程里它所产生的不同的时间点
时间分类
- Event Time: 事件创建的时间
- Ingestion Time: 数据进入flink的时间
- Processing Time: 执行操作算子的时间,与机器有关
相信通过字面意思,大家就能理解flink的时间语义
Flink 官方定义
flink源码中对时间的定义是在这个类里
org.apache.flink.streaming.api.TimeCharacteristic
其主要代码如下
image.png
通过源码文档,我们也可以看到flink官方定义的时间语义和我们理解也差不多
代码中的应用
一般来说 我们在创建flink 流式执行环境时是如下的代码。
通过这样的方式创建的环境默认是系统时间,也就是说在当前这个程序内,flink判断事件的先后顺序是以系统时间为准
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
如果想要使用消息中的字段当做事件时间,则需要指定系统参数如下
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
当然了,如果指定了事件时间,那么就必须明确到底是哪个字段作为时间时间
则需要在dataStream中调用这个方法
assignTimestampsAndWatermarks
完整示例代码如下:
dataStream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SenorReading>(Time.seconds(2)) {
@Override
public long extractTimestamp(SenorReading element) {
return element.getTimestamp() * 1000L;
}
});
其中SenorReading只是我这边测试用的POJO类,大家请忽视
网友评论