这是我参与「第四届青训营 」笔记创作活动的第3天。
流式计算是什么
- 原理:对海量的“流”式数据进行实时的处理。
- 特性:分钟级别的时效性,数据存储在消息队列中间件中,长期占有资源模型,主要应用在实时得应用场景:实时数仓、实时营销等。
- 常用概念:
- 实时计算的处理时间窗口:数据实时流动实时计算,窗口结束就提交数据。
- 处理时间:数据在流式计算系统中真正处理时所在机器的当前时间
- 事件时间:数据产生的时间
- Watermark(水位线):衡量事件真实时间的标记(一般周期性生成)
Watermark原理
- 如何传递:
- 1对1:遇大于当前Watermark则更新
- 多对1:取上游所有Watermark的的最小值且大于当前Watermark
- 问题:部分partition/subtask断流:问题详细描述:下游subtask 会将上游所有subtask的 watermark值的最小值作为自身的 watermark值。如果上游有一个subtask的 watermark不更新了,则下游的watermark都不更新。
- 解决方案:配置 idle 超时时间:当某个subtask断流超过配置的 idle 超时时间时,将当前subtask置为idle,并下发一个idle 的状态给下游。下游在计算自身watermark的时候,可以忽略掉当前是idle的那些subtask。
- Per-subtask watermark生成:早期版本都是这种机制。典型的问题是如果一个source subtask消费多个partition,那么多个partition之间的数据读取可能会加剧乱序程度。
- Per-partition watermark生成:新版本引入了基于每个 partition单独的 watermark生成机制,这种机制可以有效避免上面的问题。
- 代码引入:
- SQL:
- Datastream:
Window
- 窗口分类
- Tumble Window(滚动窗口)
- 窗口划分:每个key单独划分,每条数据只会属于一个窗口。
- Session Window(会话窗口)
- 窗口划分:每个key单独划分,每条数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge
- Sliding Window(滑动窗口):
- 窗口划分:每个key单独划分,数据可能属于多条窗口。
- Tumble Window(滚动窗口)
- 窗口触发:Window结束时间到达的时候一次性触发。
- 迟到的数据处理:默认丢弃
- Allow lateness:设置一个允许迟到的时间,保留 allowl ateness 一定的时间,继续对之前的状态进行计算。
- 适用于: DataStream. SQL
- SideOutput (侧输出流):对迟到数据打一个tag ,然后在DataStream上根据这个tag获取到迟到数据流,然后业务层面自行选择进行处理。适用于,DataStream。
- Allow lateness:设置一个允许迟到的时间,保留 allowl ateness 一定的时间,继续对之前的状态进行计算。
- EMIT输出:在window没有结束的时候提前把window计算的部分结果输出出来。
- 在DataStream里面可以通过自定义Trigger来实现。
- 优化:
- Minibatch优化:攒一批数据处理状态(需考虑算子等待延迟)
- 倾斜优化(local-global):shuffle前先预处理一下。
- Distinct计算状态复用:用64位的int类型(或long)表示64个Filter条件。
- Pane优化:对于窗口大滑动慢的情况下可以划分为更小的粒度进行计算,最后再merge成原窗口大小。