是否将状态保存在TaskManager的内存中,而不管状态后端如何?

时间:2020-09-07 06:23:37

标签: apache-flink

我知道我可以在flink的配置文件(flink-conf.yaml)中全局设置状态后端 或在按职位范围内设置。

val env = StreamExecutionEnvironment.getExecutionEnvironment()
env.setStateBackend(new FsStateBackend("hdfs://namenode:40010/flink/checkpoints"))

我在这里有一个问题:

在flink作业继续运行的情况下,TaskManager中保存的属于TasManager的状态数据在哪里?我的意思是,当完成一个检查点时,检查点数据将保存在HDFS(chk-XXX)或RocksDB中,但是当flink作业继续运行时,taskManager会积累越来越多的状态,属于这个任务管理器,它们总是保存在内存中?

如果它们保留在内存中,则检查点数据不能太大,否则可能会发生OOM。

我可以在TaskManager进程中使用RocksDB保存TM的状态数据吗?谢谢!

1 个答案:

答案 0 :(得分:1)

使用FsStateBackend,每个任务管理器的工作状态都在内存中(在JVM堆上),状态备份(检查点)进入分布式文件系统,例如HDFS。

使用RocksDBStateBackend,每个任务管理器的工作状态都在本地RocksDB实例中,即在本地磁盘上,然后状态备份(检查点)再次进入分布式文件系统,例如HDFS。

Flink从不将检查点数据存储在RocksDB中。那不是它扮演的角色。 RocksDB用作临时的嵌入式数据存储,如果任务管理器发生故障,其内容可能会丢失。这是将工作状态保存在内存中的一种替代方法(当任务管理器发生故障时,工作状态也可能会丢失)。

相关问题