——wirte by 橙心橙意橙续缘,
前言
白话系列
————————————————————————————
也就是我在写作时完全不考虑写作方面的约束,完全把自己学到的东西、以及理由和所思考的东西等等都用大白话诉说出来,这样能够让信息最大化的从自己脑子里输出并且输入到有需要的同学的脑中。PS:较为专业的地方还是会用专业口语诉说,大家放心!
白话Flink系列
————————————————————————————
主要是记录本人(国内某985研究生)在Flink基础理论阶段学习的一些所学,更重要的是一些所思所想,所参考的视频资料或者博客以及文献资料均在文末放出.由于研究生期间的课题组和研究方向与Flink接轨较多,而且Flink的学习对于想进入大厂的同学们来说也是非常的赞,所以该系列文章会随着本人学习的深入来不断修改和完善,希望大家也可以多批评指正或者提出宝贵建议。
Flink系统时间是什么‘?
————————————————————
计算机系统时间是由这个时间服务器给返回的,比如2020年12月18日15:13:54这样的东西,那么在Flink中也一样,它获得的标准时间也是处理器的系统时间,也就是我们当然自然界中的真正时间。因为我们所要处理的数据都是为了服务于日常使用的一些应用,就像天猫推荐等等,所以从时间的标准来说,计算机与人是统一的
。
时间语义是什么?
——————————————————————
也就是Flink中对时间所代表含义的不同解释。好比我们在生活中的早饭时间是7:00,晚饭时间是8:00,那么我的早饭时间便可以表达7:00这个概念。
时间(Time)语义
在Flink系统中一般有这么3种时间语义。
EventTime
事件创建或者发生的时间(数据在生成的时候自身携带的)。Ingestion Time
数据进入Flink系统的时间,(到达DataSource的时间)。Processing Time
算子执行操作的本地系统时间,(与机器相关,不同的机器可能处理同一数据的时间不同)。
哪种时间语义更重要?
Q 哪种时间语义更加重要呢?
A 其实也不能以偏概全,每种时间存在都有它的价值,我们只需要在当前应用场合下,选择合适的时间语义使用就可以。
就像上面这个例子,
- 如果我们要对星球大战电影的票房做分析,那自然要按照上映时间,也就是处理时间这个时间语义。
- 如果我们要对星球大战的剧情中的数据做梳理,那显然要用事件时间,也就是
实实在在的发生时间
。
按照常规来说,最常用的是事件时间,其次是处理时间,最后是进入时间。
图中数据发生了信号中断
按照事件时间(机器说了算,自然是0时延0乱序)和处理时间(一般是用户说了算,系统不给力了那么就乱序
或者延迟
了)所开的窗口的大小
会有所不同。
小结
事件时间
一般符合我们自然界的规律,符合用户的体验,所以比较常用,但是由于Flink集群的时延或容错或者消息队列的一些问题,就会出现迟到
或者乱序
现象。而这个乱序现象在Flink中就是由WaterMark来处理的。
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
/*TimeCharacteristic 枚举类型——3种时间语义*/
public enum TimeCharacteristic {
ProcessingTime,
IngestionTime,
EventTime
}
在代码中设置EventTime语义
assignTimestampsAndWatermarks /*该算子用于设置EventTime中的事件时间具体是哪个?*/
事件时间前面说过是由数据本身携带的,但是Flink并不清楚,所以要进行设置。同时还设置了WaterMark(后面细讲)