我知道,在Flink Datastream世界中,并行意味着每个插槽将获得一个子集的事件[1]。
Flink程序由多个任务组成(转换/运算符,数据源和汇(。一项任务被分成几个并行任务用于执行的实例,每个并行实例处理一个子集任务的输入数据。任务的并行实例数称为其并行性。
然而,在需要在表之间进行联接的Flink SQL世界中,这是如何工作的?如果表A和B中的事件是并行处理的,那么这难道不意味着插槽在任何给定的插槽中都只有表A和表B的一些事件吗?Flink是如何确保结果的一致性的,而不考虑使用的并行度,还是只是将所有事件复制到所有插槽中,在这种情况下,我不明白并行度是如何帮助实现的?
- 执行联接时,Flink会根据联接键在并行实例之间重新分发数据。这意味着表A和表B中具有相同联接键的事件将被发送到相同的并行实例进行处理。Flink通过使用基于哈希的分区策略来实现这一点
- 通过基于联接键对数据进行分区,Flink确保具有相同键的所有事件都能一起处理,而不考虑并行级别
- 并行级别决定可用于处理的并行实例或插槽的数量。每个插槽将接收基于某种分区策略的数据子集
- Flink不会将所有事件复制到所有插槽,因为这会降低效率并破坏并行性的目的。相反,Flink利用并行性将工作负载分布在多个插槽中