这是我参与「第四届青训营 」笔记创作活动的第1天
本节课的内容包括:
- 实时计算和批式计算的本质区别
- 实时计算的核心:Watermark机制和Window机制
- 三大基本窗口类型的定义、使用和核心原理
- 窗口机制最核心的优化及其原理
1.实时计算和批式计算的区别
流式计算和批式计算的对比:
批式计算:典型的数仓架构为T+1架构,数据计算需要的数据完全ready。课上老师给了小时批计算的例子,虽然一定程度上有实时的效果, 但是存在两个问题:1. 不同小时批处理之间存在资源释放和申请所带来的时间损耗。2. 在数仓层次架构较高时给定时间限制内(一小时为例)的数据可能无法及时处理完成。
实时计算:处理时间窗口,窗口结束直接发送结果,不需要周期调度任务。
批式计算虽然可以设置类似小时的批式计算,但是数据需要ready,造成了等待数据时空闲计算资源的浪费。而流式计算也设置了时间窗口,但窗口内进来的数据直接进行处理,时间窗口结束之后将该窗口的结果输出。同时事件时间窗口存在数据的延迟问题,数据在传输过程中存在无序问题,为了解决数据的延迟问题,避免非当前窗口内的数据参与当前窗口的计算。 在数据传输中引入WaterMark(类似时间戳),通过比较之后的数据和WaterMark可以判断数据是否属于当前窗口。
2.Watermark
定义:系统认为的当前真实的事件时间(数据直接生成,不需要传输,用于界定不同窗口数据的时间)
并行过程中的算子会取上游所有WMark数值中的最小值作为本身的WMark数值,同时将该Wmark传递到下游。
WaterMark存在的问题:
- 每个partition生成Wmark VS 每个subtask生成Wmark(
导致乱序加剧) - 部分partition/subtask断流(
设置Idle sourse,忽略掉当前是Idle的subtask) - 迟到数据如何处理(
Window聚合算子默认丢弃、双流join、CEP算法默认丢弃)
3.Window
3.1 Window分类
- 滚动窗口Tumble
- 滑动窗口Sliding(
一条数据属于多个窗口不会造成数据重复吗?) - 会话窗口Session(
新来的数据可以和之前的窗口合并造成窗口扩大) - 全局Window、CountWindow、累计Window等......
3.2 Window下的迟到数据(WaterMark可以通过Window End来触发窗口计算,如果当前WaterMark并没有触发窗口计算一条数据哪怕迟于WaterMark但是仍然在该窗口内也可以参与当前窗口的计算。)
迟到数据的处理方式:
- AllowLateness(
设置一个允许迟到的时间,比如迟到30分钟的数据可以用上一个状态进行处理) - SideOutput(侧输出流)(
对迟到数据打一个tag,对迟到数据流根据业务进行处理)
3.3 增量计算 VS 全量计算
3.4 EMIT触发
定义:在Window没有结束的时候,提前把Window计算的结果输出出来(不断变化的结果)。
4.Window高级优化
4.1 Mini_batch优化
问题: 对于一些聚合操作需要保存状态,如果对于每一条数据都进行状态的更新(序列化和反序列化)。
解决方法: 多条数据读一次状态写一次状态。(类似checkPoint或者Wmark进行全局的协调进行一次mini_batch)
4.2 local-global(倾斜优化)
4.3 Distinct计算状态复用
4.4 Pane优化
减少计算量(类似滚动窗口),输出需要做一次合并
5.案例分析
5.1 使用FlinkSQL计算抖音的日活曲线(倾斜优化)
5.2 使用FlinkSQL计算大数据的资源使用