这是我参与「第四届青训营 」笔记创作活动的的第4天
此次内容是在之前Flink上进行的拓展,学习Flink之后更好地理解了流计算,本节介绍流计算中的window及其优化。
一、概述
批处理典型的数仓架构为T+1架构,计算是时天级别。
实时计算分为处理时间和事件时间。
处理时间:数据在流式计算系统中真正处理所在机器的当前时间。
事件时间:事件产生时间
在数据中插入一些watermark,表示当前的真实时间。在数据存在乱序时,它可以用来在乱序容忍和实时性之间做取舍。
二、Watermark
生成方式:
Per-subtask watermark生成
Per-partition watermark 生成
存在问题:
部分partition/subtask断流
解决方案:Idle source
当断流超过配置的idle超时时间,把当前subtask设置idle,发给下游,下游计算watermark时忽略此subtask。
迟到数据处理:
算子自身决定如何处理迟到数据:
Window聚合,默认丢弃
join算子认为跟之前的join不到
三、Window
1.基本功能
分类:Tumble/Sliding/Session/全局/累计...
①滚动窗口:每个key单独划分;每条数据只会属于一个窗口
Window结束时间到达的时候一次性触发
②滑动窗口:每个key单独划分;每条数据可能属于一个窗口
Window结束时间到达的时候一次性触发
③会话窗口:每个key单独划分;每条数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge
Window结束时间到达的时候一次性触发
迟到:划分的window end比当前的watermark值还小
只有事件时间下才会有迟到的数据。
除了丢弃之外,还可以用以下方法处理:
(1)Allow lateness:设置一个允许迟到时间,窗口正常计算结束后,不会马上清理状态,会多保留Allow lateness时间。适用于:DataStream SQL
(2)SideOutput:对迟到数据打一个tag,然后在DataStream上根据这个tag获取迟到数据流,然后业务层面自行选择处理。适用于DataStream
增量计算vs全量计算
直接计算vs最后所有数据一起计算
EMIT是在window没有结束时,提前把window计算的部分结果输出。
通过DataStream里自定义Trigger实现,也可以通过SQL配置使用
2.高级优化
Mini-batch优化解决中间结果多,状态保存频繁
倾斜优化(local-global)解决数据倾斜问题
Distinct计算状态复用
Pane优化降低滑动窗口状态存储