Flink中的时间语义

2021-11-01  本文已影响0人  出水肥龙

什么是时间语义

flink 是基于流式的数据处理框架。
既然是流式,那么就会有事件到来,并由框架处理,这样的一系列流程


image.png

就像上图一样用户或者上游系统产生事件,通过发送消息这样的方式,经由消息队列传输到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类,大家请忽视

上一篇 下一篇

猜你喜欢

热点阅读