流计算中的Window计算 | 青训营笔记

97 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

本节课的内容包括:

  1. 实时计算和批式计算的本质区别
  2. 实时计算的核心:Watermark机制和Window机制
  3. 三大基本窗口类型的定义、使用和核心原理
  4. 窗口机制最核心的优化及其原理

1.实时计算和批式计算的区别

流式计算和批式计算的对比: image.png 批式计算:典型的数仓架构为T+1架构,数据计算需要的数据完全ready。课上老师给了小时批计算的例子,虽然一定程度上有实时的效果, 但是存在两个问题:1. 不同小时批处理之间存在资源释放和申请所带来的时间损耗。2. 在数仓层次架构较高时给定时间限制内(一小时为例)的数据可能无法及时处理完成。
实时计算:处理时间窗口,窗口结束直接发送结果,不需要周期调度任务。
批式计算虽然可以设置类似小时的批式计算,但是数据需要ready,造成了等待数据时空闲计算资源的浪费。而流式计算也设置了时间窗口,但窗口内进来的数据直接进行处理,时间窗口结束之后将该窗口的结果输出。同时事件时间窗口存在数据的延迟问题,数据在传输过程中存在无序问题,为了解决数据的延迟问题,避免非当前窗口内的数据参与当前窗口的计算。 在数据传输中引入WaterMark(类似时间戳),通过比较之后的数据和WaterMark可以判断数据是否属于当前窗口。


2.Watermark

定义:系统认为的当前真实的事件时间(数据直接生成,不需要传输,用于界定不同窗口数据的时间) image.png 并行过程中的算子会取上游所有WMark数值中的最小值作为本身的WMark数值,同时将该Wmark传递到下游。
WaterMark存在的问题:

  • 每个partition生成Wmark VS 每个subtask生成Wmark(导致乱序加剧)
  • 部分partition/subtask断流(设置Idle sourse,忽略掉当前是Idle的subtask)
  • 迟到数据如何处理(Window聚合算子默认丢弃、双流join、CEP算法默认丢弃)

3.Window

3.1 Window分类

  1. 滚动窗口Tumble image.png
  2. 滑动窗口Sliding(一条数据属于多个窗口不会造成数据重复吗?) image.png
  3. 会话窗口Session(新来的数据可以和之前的窗口合并造成窗口扩大) image.png
  4. 全局Window、CountWindow、累计Window等......

3.2 Window下的迟到数据(WaterMark可以通过Window End来触发窗口计算,如果当前WaterMark并没有触发窗口计算一条数据哪怕迟于WaterMark但是仍然在该窗口内也可以参与当前窗口的计算。)

迟到数据的处理方式:

  1. AllowLateness(设置一个允许迟到的时间,比如迟到30分钟的数据可以用上一个状态进行处理)
  2. SideOutput(侧输出流)(对迟到数据打一个tag,对迟到数据流根据业务进行处理)

3.3 增量计算 VS 全量计算

image.png

3.4 EMIT触发

定义:在Window没有结束的时候,提前把Window计算的结果输出出来(不断变化的结果)。


4.Window高级优化

4.1 Mini_batch优化

问题: 对于一些聚合操作需要保存状态,如果对于每一条数据都进行状态的更新(序列化和反序列化)。
解决方法: 多条数据读一次状态写一次状态。(类似checkPoint或者Wmark进行全局的协调进行一次mini_batch)

4.2 local-global(倾斜优化)

image.png

4.3 Distinct计算状态复用

image.png

4.4 Pane优化

image.png
image.png 减少计算量(类似滚动窗口),输出需要做一次合并


5.案例分析

5.1 使用FlinkSQL计算抖音的日活曲线(倾斜优化)
image.png 5.2 使用FlinkSQL计算大数据的资源使用
image.png image.png