Apache flink Flink如何处理没有';我记不起来了?

Apache flink Flink如何处理没有';我记不起来了?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,在读了一点之后,仍然不清楚传递给DataSet#mapPartitions或KeyedWindowedStream#进程的输入是否是惰性集合 在对窗口场景进行了一点调试之后,现在似乎给出了答案:输入是从映射到ArrayList的ListState读取的,但我想知道是否总是这样(或者它是否取决于输入的大小) 批处理和流处理操作员在Flink中处理状态的方式非常不同。链接的博客文章解释了Flink的批处理操作符(执行数据集程序)是如何管理内存的。流处理操作符(由数据流程序使用)使用可插拔的状态后端来

在读了一点之后,仍然不清楚传递给
DataSet#mapPartitions
KeyedWindowedStream#进程
的输入是否是惰性集合


在对窗口场景进行了一点调试之后,现在似乎给出了答案:输入是从映射到
ArrayList
ListState
读取的,但我想知道是否总是这样(或者它是否取决于输入的大小)

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

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


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

好的,我知道,但是如果我使用文件系统状态后端,并且
WindowedStream#进程
被调用的内容超过堆大小,会发生什么?考虑到
Iterable
不是惰性的(显然没有给出窗口正在使用反序列化到
ArrayList
的列表状态),结果将是内存不足异常,对吗?尽管名称不同,fsstatebend在JVM堆上保持状态。它只检查远程文件系统的所有状态。一旦TM进程中所有运算符的总体状态超过JVM堆,使用FSStateBend的作业就会失败。只有RocksDBStateBend在本地磁盘上存储状态。但是,如果单个窗口的大小超过堆,RocksDBStateBend也会失败,正如您所描述的。