Flink 时间语意

本文介绍了Flink中时间语义的区别,重点关注Event Time,并讲解了如何设置Event Time。针对乱序数据,文章详细阐述了Watermark的概念、特点、传递方式以及如何设定,强调了Watermark在处理乱序事件中的重要性。

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值