当前位置:网站首页>Flink-时间语义
Flink-时间语义
2022-07-20 05:31:00 【啦啦啦001】
什么是时间语义
在事件发生之后,生成的数据被收集起来,首先进入分布式消息队列,然后被 Flink 系统中的 Source 算子读取消费,进而向下游的转换算子(窗口算子)传递,最终由窗口算子进行计算处理。
这里有两个非常重要的时间点:
- 一个是数据产生的时间,我们把它叫作“事件时间”(Event Time);
- 一个是数据真正被处理的时刻,叫作“处理时间”(Processing Time);
- 一个是指数据进入Flink的时间,是 DataSource 拿到数据的时间,叫做“进入Flink的时间”(Ingestion Time);
我们所定义的窗口操作,到底是以那种时间作为衡量标准,就是所谓的“时间语义”(Notions of Time)。由于分布式系统中网络传输的延迟和时钟漂移,处理时间相对事件发生的时间会有所滞后。
(1)处理时间(Processing Time)
处理时间 :就是指执行处理操作的机器的系统时间。
如果我们以它作为衡量标准,那么数据属于哪个窗口就很明显了:只看窗口任务处理这条数据时,当前的系统时间。比如之前举的例子,数据 8 点 59 分 59 秒产生,而窗口计算时的时间是 9 点零 1 秒,那么这条数据就属于 9 点—10 点的窗口;
(2)事件时间(Event Time)
事件时间:是指每个事件在对应的设备上发生的时间,也就是数据生成的时间。
数据一旦产生,这个时间自然就确定了,所以它可以作为一个属性嵌入到数据中。这其实就是这条数据记录的“时间戳”(Timestamp)。
这里有个前提,就是“先产生的数据先被处理”,这要求我们可以保证数据到达的顺序。但是由于分布式系统中网络传输延迟的不确定性,实际应用中我们要面对的数据流往往是乱序的。在这种情况下,就不能简单地把数据自带的时间戳当作时钟了,而需要用另外的标志来表示事件时间进展,在 Flink 中把它叫作事件时间的“水位线”(Watermarks)。
如下代码:提取实体类CityState 中的 timestamp 时间字段作为时间的衡量标准。
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(2))
内置水位线生成器,设为2s,表示允许2s的延迟数据。
...
inputStream
.assignTimestampsAndWatermarks(WatermarkStrategy.<CityState>forBoundedOutOfOrderness(Duration.ofSeconds(2)) //设置水位线(延迟时间为2s)
.withTimestampAssigner(new SerializableTimestampAssigner<CityState>() {
//提取时间戳(使用数据中的时间戳字段)
@Override
public long extractTimestamp(CityState cityState, long l) {
return cityState.timestamp;
}
})
);
(3)进入Flink的时间(Ingestion Time)
进入Flink的时间:是指数据进入Flink的时间,是 DataSource 拿到数据的时间;
Flink 1.12 版本以后,默认的时间语义为 【事件时间 Event Time 】, 之前默认是【处理时间(Processing Time)】
边栏推荐
猜你喜欢
DOM -- event syntax
CV-Paper【1】:Deep Residual Learning for Image Recognition
[dish of learning notes dog learning C] data storage
【学习笔记之菜Dog学C】数据存储
Visual Studio 快捷键的使用技巧
直接插入排序/希尔排序
[personal summary] end of July 17, 2022
Transform streams into data products
【学习笔记之菜Dog学C】函数递归
[dish of learning notes, dog learning C] first learn operators and original code, inverse code, complement code
随机推荐
使用 poi 导入导出
背包问题(01背包/完全背包解释)
list类型转String类型
Towards Representation Alignment and Uniformity in Collaborative Filtering
牛客BM6 判断链表中是否有环
2022-7-19 Gu Yujia's learning notes of group 8 (this keyword and packaging)
Matplotlib教程(一)【初识Matplotlib】
如何用两个队列模拟实现一个栈
[dish of learning notes, dog learning C] minesweeping game
Los Angeles: t226229 arithmetic series
ModuleNotFoundError: No module named ‘PyEMD‘ 解决方法
TypeScript
选择排序/基数排序
P1926 little bookboy - question brushing Army (DP backpack (01 backpack) state transition equation)
统一返回数据格式
mysql_记录执行过的sql
Mknod command: creating device files
Call Win32 function in QT
由两个栈组成的队列
页面性能:如何系统地优化页面?