做实时用flink?用sql还是api?
Flink和Spark Streaming的区别?
Flink的三种时间语义
- 事件时间Event Time:是事件创建的时间。数据本身携带的时间。
- 进入时间Ingestion Time:是数据进入Flink的时间。
- 处理时间Processing Time:是每一个执行基于时间操作的算子的本地系统时间,与机器相关,默认的时间属性就是Processing Time。
你对Watermark的认识
- 所谓 watermark,就是在事件时间语义世界观中,用于单调递增向前推进时间的一种标记;
- 它的核心机制是在数据流中周期性地插入一种时间戳单调递增的特殊数据元素(watermark),
来不可逆转地在整个数据流中进行时间的推进;
Flink怎么处理乱序和迟到数据?
- 小延迟(乱序),用 watermark 容错 (减慢时间的推进,让本已迟到的数据被认为没有迟到)
- 中延迟(乱序),用 allowedLateness (允许一定限度内的迟到,并对迟到数据重新触发窗口计算)
- 大延迟(乱序),用 sideOutputLateData (将超出 allowedLateness 的迟到数据输出到一个侧流中)
说说Flink中的窗口(分类、生命周期、触发、划分)
-
窗口分类:
Keyed Window和Non-keyed Window
基于时间:滚动、滑动、会话。
基于数量:滚动、滑动 。 -
Window口的4个相关重要组件:
assigner(分配器):如何将元素分配给窗口。
function(计算函数):为窗口定义的计算。其实是一个计算函数,完成窗口内容的计算。
trigger(触发器):在什么条件下触发窗口的计算。
可以使用自定义触发器,解决事件时间,没有数据到达,窗口不触发计算问题,还可以使用持续性触发器,实现一个窗口多次触发输出结果,详细看连接
evictor(退出器):定义从窗口中移除数据。
问题展示:https://www.bilibili.com/video/BV1Gv4y1H7F8/?spm_id_from=333.999.0.0&vd_source=891aa1a363111d4914eb12ace2e039af
问题解决:https://www.bilibili.com/video/BV1mM411N7uP/?spm_id_from=333.999.0.0&vd_source=891aa1a363111d4914eb12ace2e039af -
窗口的划分:如,基于事件时间的滚动窗口
Start = 按照数据的事件时间向下取窗口长度的整数倍。
end = start + size
比如开了一个10s的滚动窗口,第一条数据是857s,那么它属于[850s,860s)。 -
窗口的创建:当属于某个窗口的第一个元素到达,Flink就会创建一个窗口,并且放入单例集合
-
窗口的销毁:时间进展 >= 窗口最大时间戳 + 窗口允许延迟时间
(Flink保证只删除基于时间的窗口,而不能删除其他类型的窗口,例如全局窗口)。 -
窗口为什么左闭右开:属于窗口的最大时间戳 = end - 1ms
-
窗口什么时候触发:如基于事件时间的窗口 watermark >= end - 1ms