这是我参与「第四届青训营 」笔记创作活动的的第4天.
课程内容
01.实时计算和批式计算的本质区别
02.实时计算中的核心功能
03.三大基本窗口类型的定义、使用以及核心原理
04.窗口机制中的最核心的优化及其原理
05.实例讲解
01.流式计算与批式计算的对比
处理时间窗口实现数据的实时流动:
处理时间:数据在流式计算系统中真正处理时所在机器的当前时间。
事件时间:数据产生的时间点,比如客户端,传感器,后端代码等上报数据时的时间。
理想情况下,事件时间应该等于处理时间,实际上处理时间会晚于事件时间:
引入Watermark机制解决因为数据延迟产生乱序输入的问题
Watermark:表示系统认为的当前真实的事件时间。
为什么Watermark需要传递?
如何传递Watermark?取上游所有subtask的最小值。
可以通过 Flink UI 观察 Watermark 是否正常,如何观察?
Watermark如果有部分数据断流,而又要等到了所有的数据才能进行下一个阶段,则断流的部分采用Idle Source的方法,将其作为理想值传递给下游,下游处理时不考虑所有的Idle Source。
当有迟到数据时:Window算子默认丢弃迟到数据,Join算子如果是双流join并且是outer join,则认为它不能join到任何数据
02. Window
1. 基本功能
window的分类:
①Tumble Window(滚动窗口)
②Sliding Window(滑动窗口)
③Session Window(会话窗口)
④其他窗口
1.1 滚动窗口
窗口的划分:
①每个key单独划分 (window按照时间划分,每个user对应的每个窗口是一个相对独立的区域,图中一共有15个独立的区域)有滚动时间。
②每条数据只会属于一个窗口
窗口的触发:在window结束时间到达的时候一次性触发
1.2 滑动窗口
窗口划分:
①每个key单独划分
②每条数据可能会属于多个窗口,因为滑动窗口的窗口可重叠。
窗口触发:Window结束时间到达的时候一次性触发,和滚动窗口一样。
1.3 会话窗口
窗口划分:
①每个key单独划分;窗口划分是一个动态的过程
②每条数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge(动态合并);
2. window的使用
迟到数据处理:
迟到的定义:不同场景定义的迟到不一样,一般来说数据晚于watermark就算是迟到。但在window中的标准可以划分得宽松一些,晚于watermark但是数据到达之前window尚未触发,则该数据不算迟到。
产生迟到数据的情况:只有事件时间下才会有迟到数据。
迟到数据的默认处理:丢弃
方法①:Allow lateness
设置一个允许迟到的时间。设置之后,窗口正常计算结束后,不会马上清理状态,而是会多保留allowLateness这么长时间,在这段时间内如果还有数据到来,则继续之前的状态进行计算(修正的过程)。
适用于:DataStream、SQL
方法②:SideOutput(侧输出流)
需要对迟到数据打一个tag,然后在DataStream上根据这个tag获取到迟到的数据流,在业务层可自行选择处理。
适用于:DataStream
3. 窗口计算的模型
1)增量计算
每条数据到来直接计算,window只存储计算结果。典型的reduce、aggregate等函数都是增量计算。SQL中的聚合只有增量计算。
2)全量计算 每条数据到来时先缓存,等到window触发计算的时候计算所有的数据。典型的process函数就是全量计算。
4. EMIT触发
定义:EMIT输出指的是,在window没有结束的时候,提前把window计算的部分结果输出出来。
实现:
在DataStream里可以通过自定义Trigger来实现,Trigger的结果可以是:
SQL也可以使用,通过配置:
03. 高级优化
1)Mini-batch 优化
2)倾斜优化-local-global
3)Distinct计算状态复用
4)Pane优化