我知道我可以在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的状态数据吗?谢谢!
答案 0 :(得分:1)
使用FsStateBackend,每个任务管理器的工作状态都在内存中(在JVM堆上),状态备份(检查点)进入分布式文件系统,例如HDFS。
使用RocksDBStateBackend,每个任务管理器的工作状态都在本地RocksDB实例中,即在本地磁盘上,然后状态备份(检查点)再次进入分布式文件系统,例如HDFS。
Flink从不将检查点数据存储在RocksDB中。那不是它扮演的角色。 RocksDB用作临时的嵌入式数据存储,如果任务管理器发生故障,其内容可能会丢失。这是将工作状态保存在内存中的一种替代方法(当任务管理器发生故障时,工作状态也可能会丢失)。