首页 > 解决方案 > 无论状态后端如何,状态是否都保存在 TaskManager 的内存中?

问题描述

我知道我可以在 flink 的配置文件(flink-conf.yaml)中全局设置状态后端,也可以在每个作业范围内设置。

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

我在这里有一个问题:

TaskManagerflink 作业一直运行时,属于 TasManager 的状态数据保存在哪里?我的意思是当一个 checkpoint 完成后,checkpoint 的数据会保存在 HDFS(chk-XXX) 或 RocksDB 中,但是在 flink 作业继续运行的同时,taskManager 会积累越来越多属于这个 task manager 的状态,它们总是保存在内存中?

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

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

标签: apache-flink

解决方案


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

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

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


推荐阅读