Flink如何处理内存中不适合的窗口和分区?

时间:2018-08-01 13:45:25

标签: apache-flink flink-streaming

在对how Flink manages memory进行了一些阅读之后,仍然不清楚传递给DataSet#mapPartitionsKeyedWindowedStream#process的输入是否是惰性集合。

已经对窗口场景进行了一些调试,现在看来,答案是从ListState读取输入,而ArrayList映射到{{1}},但想知道是否总是这样(还是取决于输入的大小)。

1 个答案:

答案 0 :(得分:1)

批处理和流处理运算符在Flink中处理状态的方式非常不同。链接的博客文章解释了Flink的批处理操作员(执行DataSet程序)如何管理内存。流处理运算符(由DataStream程序使用)使用可插拔状态后端存储状态。

批处理运算符使用的算法将获得固定的内存预算,如果数据超出预算,则会溢出到磁盘。例如外部合并排序或混合哈希联接算法。

在流处理应用程序中,可插拔状态后端负责维护,检查点和还原状态。有状态后端将状态存储在JVM堆上。如果一个进程中的数据超过可用的堆内存,则这些操作将失败。但是,还有一个RocksDBStateBackend会将状态存储在磁盘上的嵌入式RocksDB实例中。