Flink学习之WaterMark

【FLink】水位线(Watermark) 在Flink中,用来衡量事件时间进展的标记,就被称作“水位线”(Watermark)。说白了就是事件时间戳。 阅读详情

本文转载自https://zhuanlan.zhihu.com/p/93932720

1、问题的引入:

我们在计算流式数据时,往往会用到数据窗口的概念。比如说需要计算每一个五分钟内新增还款的金额,数据是源源不断的流进来的,那么我们就需要考虑以下几个问题:

  • 1.五分钟是指哪个时间,数据产生的时间,数据流入系统的时间,还是数据计算的时间。

  • 2.分布式系统,由于网络或者其他的外部因素往往数据不能及时的传入到fink系统中,导致数据可能会存在乱序或者延迟到达的问题。

  • 3.数据乱序或延迟后,如何保证窗口内的准确性。对于延时的数据又进行如何处理。

2、要考虑上面的问题,我们需要理解以下这几个概念。

  • 1.窗口的概念:

在flink里面大致有两种窗口:滚动窗口和滑动窗口。

比如每多长时间统计一次(基于时间)

比如每多少数量统计一次(基于数量)

比如每隔30秒统计过去1分钟的数据量(基于时间)

比如每隔10个元素统计过去100个元素的数据量(基于数量)

  • 2.时间的概念:

对于流式数据的处理,最大的特点就是数据具有时间的属性特征。Flink将数据的分为三种时间概念:

1.Event Time(事件的产生时间)

2.Ingestion Time(事件流入系统的时间)

3.Processing Time(事件的处理时间)

三种时间概念如下图所示:

1.事件生成时间是每个独立时间在产生他的设备上发生的时间,这个时间通常在事件进入Flink前就已经进入到事件当中了

2.事件接入时间是数据进入Flink系统的时间,它主要依赖于其Source Operator所在主机的系统时钟。需要注意的一点是相比于其他两者,他是不能处理乱序事件,也就不用生成对应的Watermarks
3.事件处理时间是指数据在操作算子计算过程中获取到的所在主机时间。在处理乱序事件时, 他不是最优的选择。Process Time主要用于时间计算精度要求不是特别高的计算场景,比如延时比较高的日志数据
4. Flink流式处理中,绝大部分的业务都会使用eventTime,一般只在eventTime无法使用时,考虑其他时间属性

5.而且watermark也只是在eventtime作为主时间才生效的,processtime作为主时间时,没有用,因为processtime的时候就不存在乱序问题了

3.知道窗口和时间的概念,我们就下面来解决数据乱序的问题:

当数据进入flink系统的时候,我们基于事件的时间创建window以后,我们如何确认这个window的数据是否已经全部到达,如果已经全部到达那么就可以进行窗口计算操作,如果没有全部到达,那么就需要进行等待数据的全部到达。

但是我们对于迟到的数据不能够无休止的等下去,所有我们必须有一个机制来保证特定的时间后,就必须出发window的计算操作,这个就是水印机制。

水印的作用:告知算子之后不会有小于或等于水印时间戳的事件。

横坐标是 event-time,纵坐标是 processing-time。理想的处理机制是,12:01分的 event-time 时间,应该就在 12:01分的 processing-time 时刻被处理。但是实际情况下,横向蓝色实线对应的 processing-time 晚于12:01分。所以图中横向黑色实线表示 event-time 的偏离,纵向红色实线表示 processing-time 的偏离,这些都比较容易理解。 接下来,按照原图的注释,浅色虚线表示 理想的 watermark,深色虚线表示 实际的 watermark。

Watermark 是从 event-time 维度描述输入数据的完整性, 换句话说,是系统评价数据流中处理 event-time 事件进度和完整性的方式"。在图2中,随着 processing-time 的推移,深色虚线逐步获取了 event-time 的完成进度。从概念上说,可以理解成一个函数F§ -> E,给定一个 processing-time 值,函数返回对应的 event-time 值。这个 event-time 时间值 E 就被系统认为所有早于 E 时刻的 event-time 事件都已经被观察处理过,或者说系统断言,以后都不会再有早于 E 时刻的 event-time 事件出现了。至此,对于流处理的算子(window … )而言,对于这个时间段的计算告一段落,可以生成结果了。

4、水印的产生方式:

水印有两种产生方式,第一种是定时产生(PeriodicWatermarks),需要依托于事件的属性,也就是从事件中提取得到的,但是由于数据乱序,需要设置允许延迟时间,例如事件时间是10,允许延迟时间是2,那么此时得到的watermark值就是8;第二种是遇到特定的事件时产生(PunctuatedWatermarks),特定事件由用户指定,当在流处理中遇到一条特殊标记则产生watermark。

一般生产中都是使用第一个。

5、水印的实例演示:

数据在源源不断的进入flink,我们设置好window的大小为5s,flink会以5s来将每分钟划分为连续的多个窗口,则flink划分的时间窗口为(左闭右开):

窗口的开始时间

窗口的结束时间

0

5

5

10

10

15

…….

……

50

55

55

60

进入flink的第一条数据会落在一个时间窗口内,假设数据的事件时间为13s,则落入的窗口是【10-15】。对于存在延迟的数据,我们能容忍的时间是3s,超过3s我就不等你了,继续进行窗口操作。

演示代码:

FastDateFormat instance = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss:SSS");
String host = "test-hdp-06";
int port = 9999;
StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment();
environment.setParallelism(1);
//将eventTime设置为事件时间
environment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
//默认是\n
DataStreamSource<String> stringDataStreamSource = environment.socketTextStream(host, port);
//数据的格式: flink:1559201892000
SingleOutputStreamOperator<Tuple2<String, Long>> filter = stringDataStreamSource.map(new MapFunction<String, Tuple2<String, Long>>() {
    @Override
    public Tuple2<String, Long> map(String value) throws Exception {
        try {
            String[] split = value.split(":");
            return new Tuple2<>(split[0], Long.parseLong(split[1]));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new Tuple2<>("0", 0L);
    }
}).filter(new FilterFunction<Tuple2<String, Long>>() {
    @Override
    public boolean filter(Tuple2<String, Long> value) throws Exception {
        if (!value.f0.equals("0") && value.f1 != 0) {
            return true;
        }
        return false;
    }
});
SingleOutputStreamOperator<Tuple2<String, Long>> tuple2SingleOutputStreamOperator = filter.
        assignTimestampsAndWatermarks(new AssignerWithPeriodicWatermarks<Tuple2<String, Long>>() {
            //当前时间
            long currentMaxTimestamp = 0L;
            //控制最大延迟时间
            long maxOutOfOrderness = 3000L;
            //初始化水印时间
            long lastEmittedWatermark = Long.MIN_VALUE;
        @Nullable
        @Override
        public Watermark getCurrentWatermark() {
            //System.out.println("============================================1");
            long l = currentMaxTimestamp - maxOutOfOrderness;
            if ((l &gt;= lastEmittedWatermark)) {
                lastEmittedWatermark = l;
            }
           // System.out.println("==========第一次时间" + lastEmittedWatermark);
            return new Watermark(lastEmittedWatermark);
        }

        @Override
        //为元素生成时间戳
        public long extractTimestamp(Tuple2&lt;String, Long&gt; element, long previousElementTimestamp) {
            //System.out.println("============================================2============="+previousElementTimestamp);
            long time = element.f1;
            if (time &gt; currentMaxTimestamp) {
                currentMaxTimestamp = time;
            }
            String s = String.format("key : %s    EventTime : %s waterMark : %s", element.f0, instance.format(time), instance.format(getCurrentWatermark().getTimestamp()));
            System.out.println(s);
            return time;
        }
    });

SingleOutputStreamOperator<String> apply = tuple2SingleOutputStreamOperator.keyBy(0).window(TumblingEventTimeWindows.of(Time.seconds(5L)))
.allowedLateness(Time.seconds(5L))
.apply(new WindowFunction<Tuple2<String, Long>, String, Tuple, TimeWindow>() {
@Override
public void apply(Tuple tuple, TimeWindow window, Iterable<Tuple2<String, Long>> input, Collector<String> out) throws Exception {
Iterator<Tuple2<String, Long>> iterator = input.iterator();
List<String> builder = new ArrayList<>();
while (iterator.hasNext()) {
Tuple2<String, Long> next = iterator.next();
builder.add(instance.format(next.f1));
}
String result = String.format(“key: %s data : %s startTime: %s endTime : %s”, tuple.toString(), builder.toString(), instance.format(window.getStart()),
instance.format(window.getEnd()));
out.collect(result);
}
});
apply.print(“window 的计算结果:”);
environment.execute(“test watermark”);

输入

flink1:1559201892000
flink2:1559201893000
flink3:1559201894000
flink4:1559201895000
flink5:1559201896000
flink6:1559201897000
flink7:1559201898000
flink8:1559201899000
flink8:1559201900000
flink8:1559201901000
flink9:1559201902000
flink10:1559201903000
flink11:1559201905000
flink12:1559201906000
flink14:1559201908000
flink15:1559201910000
flink16:1559201911000
flink17:1559201916000
flink:1549201916000

输出
在这里插入图片描述
在这里插入图片描述

key : flink1    EventTime : 2019-05-30 15:38:12:000 waterMark : 2019-05-30 15:38:09:000
key : flink2    EventTime : 2019-05-30 15:38:13:000 waterMark : 2019-05-30 15:38:10:000
key : flink3    EventTime : 2019-05-30 15:38:14:000 waterMark : 2019-05-30 15:38:11:000
key : flink4    EventTime : 2019-05-30 15:38:15:000 waterMark : 2019-05-30 15:38:12:000
key : flink5    EventTime : 2019-05-30 15:38:16:000 waterMark : 2019-05-30 15:38:13:000
key : flink6    EventTime : 2019-05-30 15:38:17:000 waterMark : 2019-05-30 15:38:14:000
key : flink7    EventTime : 2019-05-30 15:38:18:000 waterMark : 2019-05-30 15:38:15:000
window 的计算结果:> key: (flink1)   data : [2019-05-30 15:38:12:000] startTime: 2019-05-30 15:38:10:000 endTime : 2019-05-30 15:38:15:000
window 的计算结果:> key: (flink3)   data : [2019-05-30 15:38:14:000] startTime: 2019-05-30 15:38:10:000 endTime : 2019-05-30 15:38:15:000
window 的计算结果:> key: (flink2)   data : [2019-05-30 15:38:13:000] startTime: 2019-05-30 15:38:10:000 endTime : 2019-05-30 15:38:15:000
key : flink8    EventTime : 2019-05-30 15:38:19:000 waterMark : 2019-05-30 15:38:16:000
key : flink8    EventTime : 2019-05-30 15:38:20:000 waterMark : 2019-05-30 15:38:17:000
key : flink8    EventTime : 2019-05-30 15:38:21:000 waterMark : 2019-05-30 15:38:18:000
key : flink9    EventTime : 2019-05-30 15:38:22:000 waterMark : 2019-05-30 15:38:19:000
key : flink10    EventTime : 2019-05-30 15:38:23:000 waterMark : 2019-05-30 15:38:20:000
window 的计算结果:> key: (flink5)   data : [2019-05-30 15:38:16:000] startTime: 2019-05-30 15:38:15:000 endTime : 2019-05-30 15:38:20:000
window 的计算结果:> key: (flink6)   data : [2019-05-30 15:38:17:000] startTime: 2019-05-30 15:38:15:000 endTime : 2019-05-30 15:38:20:000
window 的计算结果:> key: (flink7)   data : [2019-05-30 15:38:18:000] startTime: 2019-05-30 15:38:15:000 endTime : 2019-05-30 15:38:20:000
window 的计算结果:> key: (flink8)   data : [2019-05-30 15:38:19:000] startTime: 2019-05-30 15:38:15:000 endTime : 2019-05-30 15:38:20:000
window 的计算结果:> key: (flink4)   data : [2019-05-30 15:38:15:000] startTime: 2019-05-30 15:38:15:000 endTime : 2019-05-30 15:38:20:000
key : flink11    EventTime : 2019-05-30 15:38:25:000 waterMark : 2019-05-30 15:38:22:000
key : flink12    EventTime : 2019-05-30 15:38:26:000 waterMark : 2019-05-30 15:38:23:000
key : flink14    EventTime : 2019-05-30 15:38:28:000 waterMark : 2019-05-30 15:38:25:000
window 的计算结果:> key: (flink9)   data : [2019-05-30 15:38:22:000] startTime: 2019-05-30 15:38:20:000 endTime : 2019-05-30 15:38:25:000
window 的计算结果:> key: (flink10)   data : [2019-05-30 15:38:23:000] startTime: 2019-05-30 15:38:20:000 endTime : 2019-05-30 15:38:25:000
window 的计算结果:> key: (flink8)   data : [2019-05-30 15:38:20:000, 2019-05-30 15:38:21:000] startTime: 2019-05-30 15:38:20:000 endTime : 2019-05-30 15:38:25:000
key : flink15    EventTime : 2019-05-30 15:38:30:000 waterMark : 2019-05-30 15:38:27:000
key : flink16    EventTime : 2019-05-30 15:38:31:000 waterMark : 2019-05-30 15:38:28:000
key : flink17    EventTime : 2019-05-30 15:38:36:000 waterMark : 2019-05-30 15:38:33:000
window 的计算结果:> key: (flink14)   data : [2019-05-30 15:38:28:000] startTime: 2019-05-30 15:38:25:000 endTime : 2019-05-30 15:38:30:000
window 的计算结果:> key: (flink12)   data : [2019-05-30 15:38:26:000] startTime: 2019-05-30 15:38:25:000 endTime : 2019-05-30 15:38:30:000
window 的计算结果:> key: (flink11)   data : [2019-05-30 15:38:25:000] startTime: 2019-05-30 15:38:25:000 endTime : 2019-05-30 15:38:30:000
key : flink    EventTime : 2019-02-03 21:51:56:000 waterMark : 2019-05-30 15:38:33:000

6、通过上面的演示我们可以看到窗口的触发条件:

窗口触发的条件是什么,也就是窗口是什么时候开始执行的?

1.窗口里面存在数据

2.存在一条数据:事件时间产生的水印时间≥窗口的结束时间

即:event Time-water Mark ≥ window End Time

假如窗口的结束时间是15s,并且当前的水印是延迟3秒,那么当到结束时间是15s的时候,我不进行窗口的计算。我等到有一条数据的事件时间是18秒,或18s以后到达(18-3≥15)再进行窗口计算(其实不是watermark触发的,watermark只是一个标记,有一个专门的trigger逻辑来控制这一切)。

7、通过演示我们得到的结论:

1.Flink 的窗口划分,不是基于数据的时间来划分的,而是基于自然时间来划分的。

比如我们设置窗口大小为5s,事件时间为 2019-11-21 01:00:02

那窗口的时间范围并不是想象中的:

[2019-11-21 01:00:02, 2019-11-21 01:00:07]

而是一个前闭后开的区间:

[2019-11-21 01:00:00 , 2019-11-21 01:00:05 )

[2019-11-21 01:00:10 , 2019-11-21 01:00:15 )

[2019-11-21 01:00:20 , 2019-11-21 01:00:15 )

  1. watermark 到达 窗口的结束时间点的时候,会触发计算。时间窗口是前闭后开的,不包括结束时间。(演示结果如下图:)

我们再演示的过程中可以看到,我们输入前两条数据是不会进行窗口计算的。

3.水印不是和某一条数据绑定的,而是一个全局的概念。也就是水印时间是一直往上的,不会下降。

我们再演示的过程中可以看到,我们输入的数据产生的水印小于当前的水印,那么当前的水印不会减小。

4.窗口计算完毕后,就直接销毁了。

我们再演示的过程中可以看到,我们输入的属于第一个窗口的数据不会再进行计算:

通过上面的结果可以看到,真正的数据可能会丢,因为有的数据真正的在窗口触发之后到达,那么迟到的数据又是我们需要的,我们又该如何处理:

我们可以在窗口上添加allowedLateness参数,这个参数是最后的等待时间,也就是在窗口结束时间再等allowedLateness参数的时间。如果还没到,那么就认为,数据再到了就没有意义了。(实时数据,如果延迟太大,就没有把必要了。)

作者:大数据部–柴晓雪

Flink原理与实战(java版)#第4章 Flink的时间与窗口(第二节窗口(二)) 介绍了Flink的窗口函数、触发器、允许的延迟以及如何使用窗口 阅读详情

相关推荐

智能优化电池:基于单片机的电池管理系统

设计简介: 本设计是基于单片机的电池管理系统,主要实现以下功能: 可通过LCD1602显示温度、电压电流值; 可通过按键调整温度、电压和电流的阈值; 用ADC0832将模拟量转换为数字量。 标签:51单片机、LCD1602、ADC0832 效果图: 总体资料: 原理图: 软件设计流程: 系统框图: 本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成电动汽车的电池管理的整个系统,...

专注单片机实战教学,分享单片机学习资料 375

Flink 如何保存状态数据

Flink 的一个重要特性就是有状态计算(stateful processing)。Flink 提供了简单易用的 API 来存储和获取状态。但是,我们还是要理解 API 背后的原理,才能更好的使用。本文分为 3 个部分: Flink支持的三种 State Backend state 文件格式 state 持久化及故障恢复 我们首先看下 state 究竟存储在哪里。 State 存储方式 Fli...

yuchuanchen的专栏 1万+

图像配准方法之灰度信息法

这系列文章是5年前的,也是从自己的QQ(632846506)日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。      图像配准的方法主要有三种:基于灰度信息方法;基于空间变换域方法;基于图像特征的方法。 一、灰度信息法。     灰度信息法直接利用两幅图像之间灰度度量的相似性,以图像内部的信息为依据,采用搜索方法寻找相似度最大或

月秀明竹的专栏 1万+

轻松通关Flink第25讲:Flink 中 watermark 的定义和使用

Flink 本身提供了两个预定义实现类去生成水印:AscendingTimestampExtractor 时间戳递增BoundedOutOfOrdernessTimestampExtractor 处理乱序消息和延迟时间这一课时讲解了生产环境中正确使用 Watermark 需要注意的事项,并且介绍了如何保证 Kafka 消息的全局有序,Flink 中自定义的时间戳提取器和水印发射器;最后用一个案例讲解了如何正确使用水印和设置乱序事件。通过这一课时你可以学习到生产中设置水印的正确方法和原理。

sucaiwa的博客 780

T527 uart串口配置导致系统进不去

T527 s_uart串口配置导致系统进不去。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 672

WPF在特定领域的应用:打造一款专业的图像编辑工具

WPF在特定领域的应用:打造一款专业的图像编辑工具,在软件开发的广阔领域中,Windows Presentation Foundation(WPF)以其强大的图形渲染能力和丰富的用户界面控件,为开发者提供了构建高性能、美观应用程序的平台。图像编辑工具作为一种对图形处理要求极高的应用类型,WPF 的特性使其成为理想的选择。本文将深入探讨如何使用 WPF 打造一款专业的图像编辑工具,涵盖从基础概念到实际代码实现的各个方面。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

统计24小时内每个小时最后一条数据_Flink最难知识点解析:时间/窗口/水印/迟到数据处理

时间、窗口、水印、迟到数据这四个知识点几乎是Flink这个框架最难点。我之前发了很多文章来解释。很多同学仍然理解不了。事实上这跟Flink的文档不全有直接关系。在这个问题上官网的资料不够,学习成本巨大。希望这篇文章能解答读者在这个问题上的困惑。本文结合源码和实例讲解。Flink支持根据事件时间处理,数据流中的每条数据都需要具有各自的时间戳,代表着数据的产生时间【事件时间】。在分布式系统中,数据流的...

weixin_39962770的博客 2655

华为OD机试 - 小火车最多人时所在园区站点(Java 2024 E卷 100分)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 995

Flink学习笔记之WaterMark

Flink的时间概念 event time: 业务系统中事件发生的事件。通常因为各种原因会有部分延迟到达系统,所以需要进行乱序处理。 ingestion time:到达流处理系统的事件,因为是在入口的地方赋值,具有流中统一不变的特性。 processing time:流处理器的本地事件,因为flink是并发执行,各个处理器的本地时钟还有网络等因素导致差异性较大。 WaterMark是什么? public final class Watermark extends StreamE...

freeRoad 209

极智AI | 算能SC5+智算卡驱动安装与升级

大家好,我是极智视界,本文介绍一下 算能SC5+智算卡驱动安装与升级

极智视界 1275

全球SAR卫星大盘点与回波数据处理专栏目录

本专栏将详细介绍各国各地区的SAR卫星的特点和性能,以及SAR回波数据的处理方法和技巧。主要介绍民用和商用SAR卫星,帮助你了解商业SAR卫星的最新动态和技术,MATLAB代码将全部开源。以下是专栏目录,持续更新中。

3152

Flink 源码学习|Watermark 与 WatermarkGenerator

当数据源中消息的事件时间单调递增时,当前事件时间(同时也是最大事件时间)就可以充当 watermark,因为后续到达的消息的事件时间一定不会比当前事件时间小。当输入数据流中消息的事件时间不完全有序,但是对于绝大部分元素,滞后时间通常不会超过一个固定的时间长度时,我们可以通过在当前最大事件时间的基础上减去一个固定延迟时间,来生成 watermark。再到达比 Watermark 的事件时间更小的消息,即在 Watermark 后到达的事件时间更小的消息视作延迟消息。接口,既可以基于消息,也可以基于周期。

长行 1709

Loki 分布式日志中心服务

分布式日志中心 Loki + Promtail + Grafana

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 2349

阿粉带你学习Flink中的Watermark

大家好,我是鸭血粉丝(大家会亲切的喊我「阿粉」),是一位喜欢吃鸭血粉丝的程序员,大家要慢慢熟悉我的存在呦,因为接下来所有的技术,都是我来给大家展示的,昨天刚回想起线上OOM,并且做了性...

Java极客技术 1584

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Flink学习:WaterMark

Flink Watermark

nzbing的博客 588

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Flink学习中之time、watermark、state

🌿今天我们来了解一下flink中的几个重要基础概念:time、watermark、state,这是flink流处理中实现数据流执行速度快和结果正确的要点,对往期内容感兴趣的同学可以看下面👇: 链接: Flink学习专辑. 🌰其实在前面的章节中,我们也介绍了一些时间、状态的概念,但不够深入,本篇博客将从flink的运行机制上说明这些概念在流处理框架中的作用。 目录1. Time2. Watermark2.1 Watermark的作用2.2 Watermark的特点2.3 Watermark的案例2.3

柳小葱的博客 2497

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Flink学习9-WaterMark

这个时候再输入(2999,a,1),(4999,a,1),但由于前面配置了allowedLateness等于3秒,所以第一个窗口会在2+6+3=11秒后关闭,再输入(11000,a,1)触发触发第一个窗口计算,会在累加(2999,a,1),(4999,a,1)求和的结果,即(a,6)。计算完毕并关闭窗口。这是会计算(1000,a,1),(3000,a,1),(2000,a,1),(5999,a,1)的求和结果,即(a,4)。这里我第一条数据输入(1000,a,1),那么第一个窗口会计算[0,6000)。

qq_40342691的博客 176

flink 学习(十一)Watermark

目录前言一、时间语义二、Watermark三、AscendingTimestampsWatermarks 前言 一、时间语义 1、Event Time         事件时间,是事件发生时的时间,在数据中带有描述时间的字段,由于从事件发生时到数据处理的过程中会经过不同的时间段,事件发生时间则很好的描述了数据的原始时间。相比其他时间语义,Event Time的事件时间是确定的,可以使用数据中的时间,也可以在数据到达flink之

码易的博客 2481

Flink学习笔记:时间与Watermark

本文摘要: 本文重点介绍了Flink流处理中的两个核心概念:时间属性和Watermark机制。首先阐述了Flink支持的三种时间属性:事件时间(EventTime)、处理时间(ProcessTime)和摄入时间(IngestionTime),并通过图示说明了它们的区别。然后详细讲解了Watermark的工作原理,包括其定义、作用以及处理迟到数据的三种方法。

K_Ohaha的博客 1384

FLink学习笔记:07-Flink 的时间语义和Watermark

文章目录时间语义Event Time 事件时间Ingestion Time:Processing Time:处理时间WaterMark 时间语义 基于时间的窗口分配器既可以处理数据的**“事件时间”也可以处理数据的“处理时间”**(Flink处理数据的那一个时间点)。 Event Time 事件时间 它通常由事件中的时间戳描述,例如采集的日志数据,每一条记录都会记录自己的生成时间,Flink通过时间戳分配器访问时间时间戳。 env.setStreamTimeCharacteristic(TimeChara

1986

老板让阿粉学习 flink 中的 Watermark,现在他出教程了

1 前言 在时间 Time 那一篇中,介绍了三种时间概念 Event、Ingestin 和 Process, 其中还简单介绍了乱序 Event Time 事件和它的解决方案 Watermark 水位线 (看过多篇文章后,决定喊它水位线,因为窗口触发条件是 Watermark > Window_end_time,有点像水流到达水位线后溢出,当然喊它水印也是可以的,全看个人爱好咯~) 前文请翻 ...

Java极客技术 679

flink 不设置水印_Flink 基础学习(九) 再谈 Watermark

1 前言在时间 Time 那一篇中,介绍了三种时间概念 Event、Ingestin 和 Process, 其中还简单介绍了乱序 Event Time 事件和它的解决方案 Watermark 水位线(看过多篇文章后,决定喊它水位线,因为窗口触发条件是 Watermark > Window_end_time,有点像水流到达水位线后溢出,当然喊它水印也是可以的,全看个人爱好咯~)前文请翻 时间 ...

weixin_35524152的博客 390
上一篇: 从滴滴的Flink CEP引擎说起
下一篇: [转载]Flink 时间窗口的起始时间
Accelerating
博客等级 码龄9年 3220粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值