Apache Flink:为什么选择FsStateBackend而不是MemoryStateBackend?

时间:2019-01-23 01:05:25

标签: apache-flink flink-streaming

Flink有一个MemoryStateBackend和一个FsStateBackend(还有一个RocksDBStateBackend)。两者似乎都扩展了HeapKeyedStateBackend,即用于存储当前工作状态的机制完全相同。

SO answer的主要区别在于MemoryStateBackend将检查点的副本保留在JobManager的内存中。 (我无法从源代码中收集任何证据。) MemoryStateBackend还限制了每个子任务的最大状态大小。

现在我不知道:您为什么要使用MemoryStateBackend

1 个答案:

答案 0 :(得分:2)

正如您所说,MemoryStateBackendFSStateBackend都基于HeapKeyedStateBackend。这意味着,两个状态后端都将操作员的状态保持为TaskManager的JVM堆上的常规对象,即状态始终在内存中访问。

后端在保持检查点状态的方式上有所不同。检查点是存储在某处的应用程序所有操作员状态的副本。如果发生故障,将重新启动应用程序,并从检查点初始化操作员的状态。

FSStateBackend将检查点存储在文件系统中,该文件系统通常是HDFS,S3或安装在所有工作程序节点上的NFS。 MemoryStateBackend将状态存储在JobManager的JVM中。这具有以下优点和缺点:

优点:

  • 无需设置(分布式)文件系统。
  • 无需配置存储位置。

缺点:

  • 如果JobManager进程死亡,状态将丢失。
  • 状态大小受JobManager内存大小限制。

由于如果JM下降,检查点将丢失,因此MemoryStateBackend不适合大多数生产用例。它对于开发和测试有状态应用程序很有用,因为它不需要配置或设置。