大纲
- Window概念理解
- 时间语义理解
- Window机制内部实现源码分析
- 生产环境中Window使用容易遇到的问题
Window类型
- CountWindow
-
TimeWindow
- Tumbling Window
- Sliding Window
- Session Window

1. Tumbling Window (翻滚窗口)
定义: 将数据依据固定的窗口长度对数据进行切片。

特点:
- 时间对齐
- 窗口长度固定
- 没有重叠
适用场景: BI统计等(做每个时间段的聚合计算)
2. Sliding Window(滑动窗口)
定义: 是固定窗口的更广义的一种形式。滑动窗口由固定的窗口长度和滑动间隔组成。

特点:
1. 时间对齐
2. 窗口长度固定
3. 有重叠
4. 对最近一个时间段内的统计
Session Window
定义:由一系列事件组和一个指定时间长度的timeout间隙组成。类似于Web应用的session。也就是一段时间没有接到新数据就会生成新的窗口。

特点:
- 时间无对齐
- 适用于线上用户行为分析
预定义KeyedWindow

Window聚合分类
- 全量聚合
- 增量聚合
全量聚合
定义:等属于窗格的数据到齐,才开始进行聚合计算。
apply(windowFunction)
process(processWindowFunction)(1.3新加的)
适合场景:求9分位,排序等。



全量聚合状态变化过程

增量聚合
- 定义:窗格每进入一条数据,就进行一次计算。
- reduce(reduceFunction)
- fold
- aggregate(aggregateFunction)
- sum(key),min(key),max(key)
- sumBy(key), minBy(key), maxBy(key) (区别不带By)
增量聚合状态变化过程

全量和增量的底层实现

全量实现:
RocksDB
ReducingState实现

增量实现:
RocksDB
ListState实现

Time类型
- EventTime
- IngestTime
-
ProcessingTime

- IngestTime: 2017-11-12 10:00:00,123
- ProcessingTime: 2017-11-12 10:00:01,234
- EventTime: 2017-11-02 18:37:15, 624
设置时间类型
不设置Time类型, 默认是ProcessingTime

EventTime & WaterMark
问题:在使用eventTime怎么处理乱序问题?
waterMark:(水位线)
- 参考google的DataFlow。
- 是eventTime处理进度的标志。
- 表示比watermark更早的时间都已经到达(没有比水位线更低的数据)
- 基于watermark来进行窗口触发计算的判断。
有序流的watermark

乱序流的watermark

并发角度的watermark

WaterMark生成方式:
- Timestamp assigner
- Wartermark generator
提取时间戳和生成generator可以在source处开始的任意一个阶段,如果指定多次后面的会覆盖前面的值。

watermark两种生成方式:
- Periodic Watermarks (周期性的)
1. 基于Timer
2. ExcetionConfig.setAutoWatermarkInterval(msec)(默认是100ms, 设置watermakr发送的周期)
3. 实现AssignerWithPeriodicWatermarks接口。 - Punctuated WaterMarks(标志位的)
- 基于某些事件触发watermark的生成和发送(由用户代码实现)
- 实现PunctuatedAssigner接口。
Periodic Watermarks设置实例

Punctuated WaterMarks

Watermark的实现方式 —— 产生


Watermark的实现方式 —— 处理

延迟数据处理方式
- allowedLateness():所能接收的最大延迟时间,延迟窗口内置状态清理时间。
- sideOutputTag:提供了延迟数据获取的一种方式,这样就不会丢弃数据了。

StreamRecord
- 首先设置该Operator的key为当前元素。
- 根据element所携带的时间戳(processing time 或者 event time)分配元素所应该属于的窗口,一个元素可能会隶属于多个窗口,比如:slideWindowAssigner。
- 如果这个窗口是一个可merge的窗口,例如:session窗口,那么就会进行和原有窗口的合并和状态的更新。前面说过sessionwindow继承了“MergingWindowAssigner”,所以是可merge的window。
窗口merge原理

WaterMark

Window遇到的一些问题

网友评论