如果 operator 的总并行实例数高于 Flink Application 的并行度会怎样?
What happens if total parallel instances of operators are higher than the parallelism Flink Application?
如果算子的并行实例总数高于 flink 系统的并行度会怎样?
场景如下:
- 假设我有一个独立的 flink 应用程序,其中包含 1 个 JobManager 和 1 个 TaskManager(有 5 个 CPU)
- 我已经设置了
taskmanager.numberOfTaskSlots=5
和parallelism.default=5
- 有2个数据源(假设两个不同的kafka主题,每个主题有五个分区)
- 对所有运算符禁用链接策略
- 我的应用程序的数据流(我只有 1 个工作,其中包括两个 kafka 源):
kafkaSource1.map(Mapper1).sink(sink1);
kafkaSource2.map(Mapper2).sink(sink1);
部署这个5并行的数据流后,TaskManager会不会过载?
据我了解,任务将像这样分布到 TaskManager 的插槽中:
- 如果这是正确的图表,在这个图表中每个插槽都有 2 个不同的操作员实例。它将如何运作?它将以并行或顺序方式工作(首先是 kafka1->map1->sink1,然后是 kafka2->map2->sink1)
- 如果不正确,它将如何工作,任务将如何分配到插槽?
图表正确。如果禁用运算符链接,则每个槽将包含 5 个任务,如图所示。每个任务都有一个 Java 线程,它将在网络上处于阻塞状态,直到有输入要处理。所有这些任务将 运行 独立地并行进行。
但是,禁用运算符链接是一个非常糟糕的主意。您将为此付出巨大的性能损失,因为它会导致 serialization/deserialization 在不需要的地方出现。 (此外,如果映射器只是从 Kafka 进行反序列化,那么如果您使用适当的 KafkaDeserializationSchema 并消除映射器,您将获得更好的性能。)
任务管理器会超载吗?可能不会,前提是您在运算符链接等方面做出了正确的选择。如果映射器正在做一些异常昂贵的事情,我只会担心。但这在一定程度上取决于您需要达到的吞吐量。
如果算子的并行实例总数高于 flink 系统的并行度会怎样?
场景如下:
- 假设我有一个独立的 flink 应用程序,其中包含 1 个 JobManager 和 1 个 TaskManager(有 5 个 CPU)
- 我已经设置了
taskmanager.numberOfTaskSlots=5
和parallelism.default=5
- 有2个数据源(假设两个不同的kafka主题,每个主题有五个分区)
- 对所有运算符禁用链接策略
- 我的应用程序的数据流(我只有 1 个工作,其中包括两个 kafka 源):
kafkaSource1.map(Mapper1).sink(sink1);
kafkaSource2.map(Mapper2).sink(sink1);
部署这个5并行的数据流后,TaskManager会不会过载?
据我了解,任务将像这样分布到 TaskManager 的插槽中:
- 如果这是正确的图表,在这个图表中每个插槽都有 2 个不同的操作员实例。它将如何运作?它将以并行或顺序方式工作(首先是 kafka1->map1->sink1,然后是 kafka2->map2->sink1)
- 如果不正确,它将如何工作,任务将如何分配到插槽?
图表正确。如果禁用运算符链接,则每个槽将包含 5 个任务,如图所示。每个任务都有一个 Java 线程,它将在网络上处于阻塞状态,直到有输入要处理。所有这些任务将 运行 独立地并行进行。
但是,禁用运算符链接是一个非常糟糕的主意。您将为此付出巨大的性能损失,因为它会导致 serialization/deserialization 在不需要的地方出现。 (此外,如果映射器只是从 Kafka 进行反序列化,那么如果您使用适当的 KafkaDeserializationSchema 并消除映射器,您将获得更好的性能。)
任务管理器会超载吗?可能不会,前提是您在运算符链接等方面做出了正确的选择。如果映射器正在做一些异常昂贵的事情,我只会担心。但这在一定程度上取决于您需要达到的吞吐量。