什么是窗口
为什么要有窗口和时间
拥有时间可以在无限数据流中通过时间截取一个有限片段,对这个片段进行各种计算,比如统计一天的客流量等问题。在Flink中用时间截取的片段叫Window。
使用窗口和时间
- 第一条数据到达,WindowAssigner分配一个Window。
- 每条数据或超时触发Trigger,Trigger返回Fire则进行下一步。
- 触发Evictor(可选)
- 触发Window Function。
举例:时间窗口超过最大时间则Trigger返回Fire,执行Window Function。
Trigger
常见作用:触发window function,删除window中数据条目。
具体实现
下面代码registerProcessingTimeTimer进行了定时器注册,超时后会调用onProcessingTime。
@Override
public TriggerResult onElement(Object element, long timestamp, TimeWindow window, TriggerContext ctx) {
ctx.registerProcessingTimeTimer(window.maxTimestamp());
return TriggerResult.CONTINUE;
}
@Override
public TriggerResult onProcessingTime(long time, TimeWindow window, TriggerContext ctx) {
return TriggerResult.FIRE;
}
Evictors
窗口的优化
有时窗口可以不用保存所有数据,只要保存一个结果值比如和或者最大值。这样可以极大降低内存。如果定义了Evictor不会优化,因为会保存所有窗口数据。
窗口生命周期
属于窗口的第一个元素到达,生成窗口。窗口截止时间+允许延迟,窗口销毁。
注意:非Key的Window会把数据聚集到一起并行度变成1。