让我把它说出来,我是一个非常 Flink 的初学者,并试图尽可能多地抓住概念。
比方说,我有一个带有 10 个任务管理器的 flink 集群。我在每个上运行一个 flink 作业。作业也使用广播状态。此广播状态是通过每 10 分钟读取 5 个 S3 文件、执行一些处理并创建广播int to list of strings
映射来创建的。
问题:读取文件在哪里发生,是在 JobManager 读取和处理文件并将处理后的内容发送给任务管理器。
或
是任务管理器执行所有读取和处理吗?如果是这种情况,那么 flink 如何确保如果任务管理器无法从 S3 读取,则所有任务管理器的广播状态都相同。
编辑
因此,任务管理器读取广播流并将其广播到下游任务。
例如。假设有一个 Kafka 流,需要广播 5 个分区。还有一个并行度为 5 的下游运算符。
- 分区 1 使用者任务,从流中读取元素并将其设置为广播状态。一旦设置了此设置,状态就会广播到所有下游操作员 5 任务。
- 分区 2 使用者任务,从流中读取元素并将其设置为广播状态。
问题:此时,当我们从分区 2 元素或 flink 本身管理此功能时,我们是否需要确保不会覆盖分区 1 中的元素。
或
另外,我们如何确定在分区 2 消耗元素并设置广播状态时,分区 1 广播状态已到达分区 2 下游算子任务。
在哪里读取文件?
任务管理器。作业管理器只负责管理调度和故障转移等任务。
如何将处理后的内容发送给任务管理器?
您可以简单地将广播状态过程想象为向所有下游任务发送相同的消息,而不是发送到特定任务。
如果任务管理器无法从 S3 读取,flink 如何处理?
如果源任务无法从 S3 读取,我相信会重新启动(可能是完全重新启动或部分重新启动(,检查点机制将确保状态的一致性。
所有任务管理器的广播状态都相同。
实际上,广播状态并非在所有任务中都完全相同。原因是无法保证在网络传输期间以相同的顺序将事件传递到任务。