java Flink(十)窗口模式配合Watermark的使用

Watermark的基本概念

首先讲解一下Flink中的时间语义:

Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的 日志数据中,每一条日志都会记录自己的生成时间,Flink 通过时间戳分配器访问事 件时间戳。

Ingestion Time:是数据进入 Flink 的时间。

Processing Time:是每一个执行基于时间操作的算子的本地系统时间,与机器 相关,默认的时间属性就是 Processing Time。

  如果我们的数据出现乱序,那么此时出现一个问题,一旦出现乱序,如果只根据 eventTime 决定 window 的 运行,我们不能明确数据是否全部到位,但又不能无限期的等下去,此时必须要有 个机制来保证一个特定的时间后,必须触发 window 去进行计算了,这个特别的机 制,就是 Watermark。

1、Watermark 是一种衡量 Event Time 进展的机制

2、Watermark 是用于处理乱序事件的,而正确的处理乱序事件,通常用 Watermark 机制结合 window 来实现

3、数据流中的 Watermark 用于表示 timestamp 小于 Watermark 的数据,都已经 到达了,因此,window 的执行也是由 Watermark 触发的。

4、Watermark 可以理解成一个延迟触发机制,我们可以设置 Watermark 的延时 时长 t,每次系统会校验已经到达的数据中最大的 maxEventTime,然后认定 eventTime 小于 maxEventTime - t 的所有数据都已经到达,如果有窗口的停止时间等于 maxEventTime – t,那么这个窗口被触发执行。

 

代码demo

public static void main(String[] args) throws Exception{
        //获取当前执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //设置并行度
        env.setParallelism(1);
        //设置时间语义为时间时间
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
        //从文件读取数据 ***demo模拟的文本流处理,其实不该用文本流处理,因为读取文本根本不许要分桶,速度过快了
        DataStream<String> inputStream = env.readTextFile("D:\\idle\\FlinkTest\\src\\main\\resources");

        //转换成SensorReading类型
        DataStream<SensorReading> dataStream = inputStream.map(new MapFunction<String, SensorReading>() {
            public SensorReading map(String line) throws Exception {
                String[] fields = line.split(",");
                return new SensorReading(fields[0], new Long(fields[1]), new Double(fields[2]));
            }
        });
        //设置Watermark 处理乱序数据
        dataStream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SensorReading>(Time.seconds(3)) { //设置最大乱序处理时间
            @Override
            public long extractTimestamp(SensorReading element) {
                return element.getTimestamp() * 1000L; //返回时间戳 单位是ms
            }
        });
        //设置Watermark 处理升序数据(数据为顺序数据)
        dataStream.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<SensorReading>() {
            @Override
            public long extractAscendingTimestamp(SensorReading element) {
                return element.getTimestamp() * 1000L; //返回时间戳 单位是ms
            }
        });

        dataStream.keyBy("id").timeWindow(Time.seconds(15)).minBy("temperature");
        env.execute();



    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值