什么是窗口

为什么要有窗口和时间

拥有时间可以在无限数据流中通过时间截取一个有限片段,对这个片段进行各种计算,比如统计一天的客流量等问题。在Flink中用时间截取的片段叫Window。

使用窗口和时间

  1. 第一条数据到达,WindowAssigner分配一个Window。
  2. 每条数据或超时触发Trigger,Trigger返回Fire则进行下一步。
  3. 触发Evictor(可选)
  4. 触发Window Function。

举例:时间窗口超过最大时间则Trigger返回Fire,执行Window Function。

Trigger

常见作用:触发window function,删除window中数据条目。
具体实现

下面代码registerProcessingTimeTimer进行了定时器注册,超时后会调用onProcessingTime。

  1. @Override
  2. public TriggerResult onElement(Object element, long timestamp, TimeWindow window, TriggerContext ctx) {
  3. ctx.registerProcessingTimeTimer(window.maxTimestamp());
  4. return TriggerResult.CONTINUE;
  5. }
  6. @Override
  7. public TriggerResult onProcessingTime(long time, TimeWindow window, TriggerContext ctx) {
  8. return TriggerResult.FIRE;
  9. }

Evictors

删除数据条目。

窗口的优化

有时窗口可以不用保存所有数据,只要保存一个结果值比如和或者最大值。这样可以极大降低内存。如果定义了Evictor不会优化,因为会保存所有窗口数据。

窗口生命周期
属于窗口的第一个元素到达,生成窗口。窗口截止时间+允许延迟,窗口销毁。
注意:非Key的Window会把数据聚集到一起并行度变成1。