我是 Flink 的新手,计划在 EKS 上部署 Flink 会话集群,有 1 个作业管理器和 5 个任务管理器(每个任务管理器有 4 个插槽(。不同的作业将通过 UI 针对不同的用例提交。
假设我提交了一个有状态的作业(作业有使用 RichFlatMapFunction 的简单计数器逻辑(,由 RocksDBStateBackend 支持,S3 checkpointDataUri 和 DbStoragePath 指向本地文件路径,并且此作业总共使用 8 个插槽,分布在两个任务管理器中,运行良好,一天没有任何问题。现在以下是我的问题,
1(我对RocksDBStateBack中的checkpointDataUri和DbStoragePath的理解是,checkpointDataUri将处理后的偏移量信息存储在S3中(因为我配置了带有S3前缀的checkpointDataUri(,并且DbStoragePath包含RichFlatMapFunction中使用的所有状态信息。因此,所有有状态信息都存储在检查点DataUri中,该检查点仅在本地可用。如果错误,请纠正我。
2( 假设我的 Ec2 实例由于某种原因重新启动(使用 4 个插槽的实例(,并且大约需要 30 分钟才能上线,在这种情况下,EKS 会将新的 Ec2 实例作为任务管理器以匹配副本,但是 Flink 作业管理器现在是否会尝试将 4 个插槽重新调度到不同的任务管理器?如果是,如何恢复存储在 Ec2 本地实例中的状态?
3(是否有任何Flink EKS故障恢复相关内容的文档/视频。我看到了官方文档,其中指定了如何在 EKS 中部署 Flink 会话集群。但是我没有找到与 EKS 模式下的故障恢复相关的任何内容。有人可以指出我正确的方向吗?
您关注的所有状态,即已处理的偏移量和RichFlatMapFunction
中使用的状态(以及 Flink 为您的作业管理的任何其他状态(都存储在本地磁盘 (DbStoragePath( 和 S3 (checkpointDataUri( 中。
Flink 始终在每个任务管理器本地保留所有状态的工作副本(以实现高吞吐量和低延迟(,并在后台将此状态的完整副本复制到分布式文件系统(如 S3(以提高可靠性。
换句话说,你在问题的第(1(点中所说的是不正确的。第 (2( 点的答案是,如果要恢复的状态在本地不可用,则始终可以从 S3 中恢复。至于第 (3( 点,与任何其他 Flink 部署模型相比,EKS 上的故障恢复没有什么特别之处。