这是我参加「第四届青训营 」笔记创作活动的第4天
一. 概述
为了实现实时性的计算结果,采用处理时间窗口进行实时计算,数据实时流动,实时计算,窗口结束直接发送结束,不需要周期调度任务。
-
时间
- 处理时间:数据在流式计算系统中真正处理时所在机器的当前时间。
- 事件时间:数据产生的事件,比如客户端、传感器、后端代码等上报数据的时间。
数据实时进入到真实事件发生的窗口中进行计算,可以有效地处理数据延迟和乱序。
二. Watermark
- 含义:
- Watermark定义:当前系统认为的事件时间所在的真实时间。
- 生成:
- 可以通过Watermark Generator 来生成
- 传递:
- 取上游所有subtask的最小值
- 部分数据断流:
- Idle Source
- 迟到的数据处理:
- window算子默认是丢弃;
- Join算子认为跟之前的数据无法join到
三. Window
3.1 基本功能
3.1.1 典型的window分类:
- Tumble Window(滚动窗口)
- 窗口划分
- 每个key单独划分
- 每条数据只会属于一个window
- 窗口触发
- Window结束时间到达的时候一次性触发
- 窗口划分
- Tumble Window(滚动窗口)
- 窗口划分
- 每个key单独划分
- 每条数据只会属于一个window
- 窗口触发
- Window结束时间到达的时候一次性触发
- 窗口划分
- Session Window(会话窗口)
- 窗口划分
- 每个key单独划分
- 每条数据会单独划分为一个窗口,如果window之间有交集(session gap小于设定的时间),则会对窗口进行merge
- 窗口触发
- Window结束时间到达的时候一次性触发
- 窗口划分
3.1.2 迟到的数据处理
定义迟到:一条数据到来后,会用WindowAssigner给它划分一个window,一般时间窗口是一个时间区间,如果划分出来的window end比当前的watermark值还要小,说明这个窗口已经触发了,这条数据就是迟到数据。只有事件时间下才会有迟到的数据。一般我们默认迟到数据处理就是丢弃。只有事件时间下才会有迟到的数据
- Allow lateness
- SideOutput(侧输出流)
3.1.3 增量计算 and 全计算量
- 增量计算:每条数据到来后,直接参与计算,window只存储计算结果,不保存每条数据。
- 全量计算:每条数据到来后,会存储到window的state里,等到window触发计算的时候,才把所有数据拿出来统一进行计算。
3.1.4 EMIT触发
WHY:通常来讲,window都是在结束的时候才会进行输出,比如1h的tumble window,要在1h后才能同意输出结果。但若window比较大(如1day),那么计算延迟过高,失去了实时计算的意义。故EMIT是指在window没结束时提前输出计算的部分结果
3.2 高级优化
- Mini-batch优化:解决频繁访问状态的问题;
- local-global优化:解决倾斜问题;
- Distinct状态复用降低状态量
- Pane优化:降低滑动窗口的状态存储量