Flink有一个MemoryStateBackend
和FsStateBackend
(以及RocksDBStateBackend
)。两者似乎都扩展了HeapKeyedStateBackend
,即用于存储当前工作状态的机制完全相同。
该SO answer表示主要区别在于MemoryStateBackend
在JobManagers内存中保留了检查点的副本。 (我无法从源代码中收集任何证据。)MemoryStateBackend
还限制了每个子任务的最大状态大小。
现在我想知道:为什么您要使用MemoryStateBackend
?
最佳答案
如您所说,MemoryStateBackend
和FSStateBackend
都基于HeapKeyedStateBackend
。这意味着,两个状态后端都将运算符(operator)的状态保持为TaskManager的JVM堆上的常规对象,即状态始终在内存中访问。
后端在保持检查点状态的方式上有所不同。检查点是存储在某处的应用程序所有运算符(operator)状态的副本。如果发生故障,将重新启动应用程序,并从检查点初始化运算符(operator)的状态。FSStateBackend
将检查点存储在文件系统中,该文件系统通常是HDFS,S3或安装在所有工作程序节点上的NFS。 MemoryStateBackend
将状态存储在JobManager的JVM中。这具有以下优点和缺点:
优点:
缺点:
由于如果JM停机,检查点将丢失,因此
MemoryStateBackend
不适合大多数生产用例。它对于开发和测试有状态应用程序很有用,因为它不需要配置或设置。