17.DataStream API之Event Time(Pre-defined Timestamp Extractors Watermark Emitte)

flink 1.8

Pre-defined Timestamp Extractors / Watermark Emitters

 

正如在时间戳和水印处理timestamps and watermark handling中描述的,Flink提供了接口,允许编程者分配自己的时间戳并发出自己的水印。更确切的说,可以根据情况,实现 AssignerWithPeriodicWatermarks 或 AssignerWithPunctuatedWatermarks接口。简单来说,AssignerWithPeriodicWatermarks 会周期性的发射watermark,AssignerWithPunctuatedWatermarks 会根据数据的某些属性来决定是否发射watermark。

为了进一步简化此类任务的编程工作,flink自带了一些默认实现的timestamp assigner分配器。这一部分会介绍它们。除了它们开箱即用的特性,它们的实现也是一个实现自定义类的很好的参考。

 

Assigners with ascending timestamps

Periodic Watermarks最简单的场景便是source中数据的timestamp是按升序流入。这种情况下,当前流入数据的timestamp就可以当做是watermark,因为不会有乱序的情况发生,也就是不会有小于当前数据时间戳的数据在当前数据之后流入。

注意,只需要确保每个并行数据源任务source task的时间戳是升序生成即可。例如:通过设置后,每个Kafka partiton都在一个独立的source task中读取数据,这时,只要求每个partition的数据的时间戳是升序的就可以。Flink的watermark的merge机制会在并发流parallel streams被shuffled, unioned, connected或者merged时生成正确的watermark。

DataStream<MyEvent> stream = ...

DataStream<MyEvent> withTimestampsAndWatermarks =
    stream.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<MyEvent>() {

        @Override
        public long extractAscendingTimestamp(MyEvent element) {
            return element.getCreationTime();
        }
});

Assigners allowing a fixed amount of lateness

另一个使用 Periodic Watermarks 的场景是watermark始终落后当前流中最大时间戳一个固定的时间。也适用于事前就知道流中数据的最大延迟时间的情况,例如:在测试时,使用自定义source读取在一定时间范围内乱序的数据。(注:最大迟到时间不是指数据的时间戳与系统时间的差值,而是迟到数据与该数据之前流入的数据的最大时间戳的差值)

对于这种情况,flink提供了 BoundedOutOfOrdernessTimestampExtractor ,它的入参为 maxOutOfOrderness,也就是,对于给定的window来说,它需要在event time坐标系下等待多久的迟到数据之后再触发计算(超过等待时间的数据会被忽略)。数据是否迟到取决于 lateness= t - t_w 的值,其中t代表event time坐标系下数据的时间戳,t_w代表该数据之前的最大watermark。如果 lateness > 0 (个人认为表述有问题),那么该数据会被认为是迟到了,默认情况下,当进行window计算时,该数据会被忽略,不参与计算。有关处理延迟元素的更多信息,请参阅有关允许延迟allowed lateness的文档。(注:根据这个公式,我觉得是 lateness < 0 的情况下,才是迟到数据)

DataStream<MyEvent> stream = ...

DataStream<MyEvent> withTimestampsAndWatermarks =
    stream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<MyEvent>(Time.seconds(10)) {

        @Override
        public long extractTimestamp(MyEvent element) {
            return element.getCreationTime();
        }
});

 

https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/event_timestamp_extractors.html

https://flink.sojb.cn/dev/event_timestamp_extractors.html

https://www.jianshu.com/p/aa23effc3898

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值