Flink流窗口内存使用情况

时间:2017-11-04 00:08:06

标签: apache-flink flink-streaming

我正在评估Flink专门针对可能的警报生成的流媒体窗口支持。我担心的是内存使用情况,所以如果有人可以提供帮助,我们将不胜感激。

例如,此应用程序将在5分钟的给定翻滚窗口内消耗来自流的大量数据。在评估时,如果有一百万个文档例如符合标准,那么它们都会被加载到内存中吗?

一般流程如下:

producer -> kafka -> flinkkafkaconsumer -> table.window(Tumble.over("5.minutes").select("...").where("...").writeToSink(someKafkaSink)

此外,如果有一些明确的文档描述了在这些情况下如何处理内存,我可能忽略了某人可能会有所帮助。

由于

1 个答案:

答案 0 :(得分:4)

为组窗口聚合存储的数据量取决于聚合的类型。许多聚合函数(例如COUNTSUMMIN / MAX)可以预先聚合,即,它们只需要为每个窗口存储单个值。其他聚合函数(例如MEDIAN或某些用户定义的聚合函数)需要在计算结果之前存储所有值。

需要为聚合存储的数据存储在state backend中。根据状态后端的选择,数据可能存储在JVM堆中的内存中或RocksDB实例中的磁盘上。

表API查询也由关系优化器(基于Apache Calcite)优化,以便尽可能地将过滤器推向源。根据谓词,可以在聚合之前应用过滤器。

最后,您需要在示例查询中的groupBy()window()之间添加select()(请参阅docs中的示例)。