Flink:窗口计算

窗口编程模型

  • Keyed Windows
1
2
3
4
5
6
7
8
9
stream
.keyBy(...) <- 仅 keyed 窗口需要
.window(...) <- 必填项:"assigner"
[.trigger(...)] <- 可选项:"trigger" (省略则使用默认 trigger)
[.evictor(...)] <- 可选项:"evictor" (省略则不使用 evictor)
[.allowedLateness(...)] <- 可选项:"lateness" (省略则为 0)
[.sideOutputLateData(...)] <- 可选项:"output tag" (省略则不对迟到数据使用 side output)
.reduce/aggregate/apply() <- 必填项:"function"
[.getSideOutput(...)] <- 可选项:"output tag"
  • Non-Keyed Windows
1
2
3
4
5
6
7
8
stream
.windowAll(...) <- 必填项:"assigner"
[.trigger(...)] <- 可选项:"trigger" (else default trigger)
[.evictor(...)] <- 可选项:"evictor" (else no evictor)
[.allowedLateness(...)] <- 可选项:"lateness" (else zero)
[.sideOutputLateData(...)] <- 可选项:"output tag" (else no side output for late data)
.reduce/aggregate/apply() <- 必填项:"function"
[.getSideOutput(...)] <- 可选项:"output tag"

窗口生命周期

备注:参考Flink代码WindowOperator和EvictingWindowOperator。

窗口分配器Window Assigner

WindowAssigner 负责将 stream 中的每个数据分发到一个或多个窗口中。

窗口函数Window Function

函数类型 说明 函数类 API
聚合函数 每一次有数据被分配到窗口时,都会调用 ReduceFunction 或者 AggregateFunction 来增量聚合。 ReduceFunction
AggregateFunction
WindowedStream:
  sum(), max(), min(), maxBy(), reduce(), aggregate()
窗口函数 ProcessWindowFunction 会缓存 Iterable 和窗口内容,供接下来全量的窗口计算。 ProcessWindowFunction
ProcessAllWindowFunction
WindowedStream:
  process(ProcessWindowFunction)
聚合+窗口函数 ProcessWindowFunction 与 ReduceFunction 或 AggregateFunction 搭配使用,使其能够在数据到达窗口的时候进行增量聚合。在窗口关闭时,ProcessWindowFunction 会得到聚合的结果。这样就可以做到增量聚合窗口的元素,并且可以从 ProcessWindowFunction中获得窗口的元数据。   WindowedStream:
  reduce(ReduceFunction,ProcessWindowFunction)
  aggregate(AggregateFunction,WindowFunction)

触发器Trigger

清除器Evictor

参考

  1. https://nightlies.apache.org/flink/flink-docs-master/docs/dev/datastream/operators/windows/
  2. https://nightlies.apache.org/flink/flink-docs-master/docs/learn-flink/streaming_analytics/
  3. https://nightlies.apache.org/flink/flink-docs-master/zh/docs/dev/datastream/event-time/generating_watermarks/