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