美文网首页
Window和Time

Window和Time

作者: 尼小摩 | 来源:发表于2018-06-22 18:30 被阅读26次

大纲

  • Window概念理解
  • 时间语义理解
  • Window机制内部实现源码分析
  • 生产环境中Window使用容易遇到的问题

Window类型

  • CountWindow
  • TimeWindow
    1. Tumbling Window
    2. Sliding Window
    3. 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生成方式:

  1. Timestamp assigner
  2. Wartermark generator

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

watermark两种生成方式:

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

Periodic Watermarks设置实例

Punctuated WaterMarks

Watermark的实现方式 —— 产生

Watermark的实现方式 —— 处理

延迟数据处理方式

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

StreamRecord

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

窗口merge原理

WaterMark

Window遇到的一些问题

相关文章

网友评论

      本文标题:Window和Time

      本文链接:https://www.haomeiwen.com/subject/vgnkyftx.html