在对how Flink manages memory进行了一些阅读之后,仍然不清楚传递给DataSet#mapPartitions
或KeyedWindowedStream#process
的输入是否是惰性集合。
已经对窗口场景进行了一些调试,现在看来,答案是从ListState
读取输入,而ArrayList
映射到{{1}},但想知道是否总是这样(还是取决于输入的大小)。
答案 0 :(得分:1)
批处理和流处理运算符在Flink中处理状态的方式非常不同。链接的博客文章解释了Flink的批处理操作员(执行DataSet程序)如何管理内存。流处理运算符(由DataStream程序使用)使用可插拔状态后端存储状态。
批处理运算符使用的算法将获得固定的内存预算,如果数据超出预算,则会溢出到磁盘。例如外部合并排序或混合哈希联接算法。
在流处理应用程序中,可插拔状态后端负责维护,检查点和还原状态。有状态后端将状态存储在JVM堆上。如果一个进程中的数据超过可用的堆内存,则这些操作将失败。但是,还有一个RocksDBStateBackend
会将状态存储在磁盘上的嵌入式RocksDB实例中。