Flink中的时间语义

什么是时间语义

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类,大家请忽视

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。