apache-flink - 无论状态后端如何,状态是否都保存在 TaskManager 的内存中?
问题描述
我知道我可以在 flink 的配置文件(flink-conf.yaml)中全局设置状态后端,也可以在每个作业范围内设置。
val env = StreamExecutionEnvironment.getExecutionEnvironment()
env.setStateBackend(new FsStateBackend("hdfs://namenode:40010/flink/checkpoints"))
我在这里有一个问题:
TaskManager
flink 作业一直运行时,属于 TasManager 的状态数据保存在哪里?我的意思是当一个 checkpoint 完成后,checkpoint 的数据会保存在 HDFS(chk-XXX) 或 RocksDB 中,但是在 flink 作业继续运行的同时,taskManager 会积累越来越多属于这个 task manager 的状态,它们总是保存在内存中?
如果它们保存在内存中,那么检查点数据不能太大,否则可能会发生OOM。
我可以在 TaskManager 进程中使用 RocksDB 来保存 TM 的状态数据吗?谢谢!
解决方案
使用 FsStateBackend,每个任务管理器的工作状态都在内存中(在 JVM 堆上),状态备份(检查点)转到分布式文件系统,例如 HDFS。
使用 RocksDBStateBackend,每个任务管理器的工作状态都在本地 RocksDB 实例中,即在本地磁盘上,并且状态备份(检查点)再次进入分布式文件系统,例如 HDFS。
Flink 从不将检查点数据存储在 RocksDB 中。这不是它所扮演的角色。RocksDB 用作临时的嵌入式数据存储,如果任务管理器失败,其内容可能会丢失。这是将工作状态保存在内存中的替代方法(当任务管理器失败时,它也可能丢失)。
推荐阅读
- javascript - 更新 async forEach 以根据来自另一个集合的属性更新每个文档属性
- javascript - 使用地图获取数组中每个项目的数量
- reactjs - 如何使用 React 的 CSSTransitionGroup 淡入/淡出我的警报消息?
- javascript - 从序列化为 JSON 的 Django 对象中提取值的问题
- django - 如何在views.py [Django]中传递可选参数
- amazon-web-services - 与远程服务器进行 SSL 握手期间的 Apache 错误
- react-native - 任务 :app:generateBundledResourcesHashRelease 在构建 relese apk react-native 时失败
- javascript - css - 无法将按钮移动到中心
- c++ - 在 C++ 中用 cin 读取同一行中的多个整数
- php - Symfony 表实体本身也被识别为存储库