这是我参与「第四届青训营 」笔记创作活动的的第4天
课堂内容
流计算和批计算的差异
- 批计算一般是T+1的数仓架构
- 数据实时性越高,数据的价值越高
- 实时计算分为处理时间和事件时间
- 事件时间需要watermark配合来处理乱序
Watermark
表示系统认为的当前真实的事件时间。代码如下
原理是通过watermark Generator在source之前,给数据一个筛选命令,同时这个命令也会传给下游 。我们可以在Flink UI中看到low watermark的值
、
- per-subtask watermark生成的watermask可能会加剧乱序,per-partition watermask则不会。
- 部分数据断流用Idle source算子处理
- 迟到的数据的三种处理
Window的基础
- 代码实现
- 典型窗口:滚动窗口,滑动窗口,会话窗口
其他窗口:全局窗口,count窗口,累加窗口等等
- 迟到数据的处理方法
1,Allow lateness:设置一个允许迟到的时间,就是数据都算完了,但是不立刻释放,允许比如说迟到半个小时的数据继续进行计算
2,SideOutput:对迟到的数据打一个tag,然后在DataStream上根据这个tag获取迟到数据,再去算这一部分的数据。 - 增量计算和全量计算
增量计算是只存储计算结果,不存储数据本身,典型的reduce,aggregate函数都是增量计算。全量计算是在window的stata中将数据全部存储,等window触发再拿出来算,这样的函数有process - EMIT输出 在window没有结束的时候,提前把window计算的部分结果输出出来。
、
window的高级优化
- Mini-batch优化:解决频繁访问状态的问题
- local-global优化:解决倾斜问题
- Distinct计算状态复用:降低状态量
- Pane优化:降低滑动窗口的状态存储量
案例分析
- 抖音日活曲线:滚动窗口,还用了分桶两阶段聚合,来使得数据可以运行。
- 大数据任务的资源使用:会话窗口