美文网首页
Flink中的时间语义

Flink中的时间语义

作者: 出水肥龙 | 来源:发表于2021-11-01 14:11 被阅读0次

    什么是时间语义

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

    相关文章

      网友评论

          本文标题:Flink中的时间语义

          本文链接:https://www.haomeiwen.com/subject/pqjzaltx.html