为什么 Flink 没有均匀地分配我的工作以及如何解决这个问题?

问题描述 投票:0回答:1

我有一个从具有 5 个分区的数据源读取数据的 Flink 作业。我在配置文件中将每个任务管理器的并行度设置为 100。

在我的输入操作中,它仅使用 5/100 任务管理器来读取 5 个分区。但之后,在我的映射和过滤操作中,我希望 Flink 获取之前读取的数据并将其分发给 100 个任务管理器中的每一个。但它并没有这样做。它仅将数据发送到映射和过滤操作中的 5/100 任务管理器。剩下的 95/100 根本没有使用。

如何强制flink使用所有任务管理器?

java apache-flink flink-streaming
1个回答
0
投票

有几个因素会影响这一点:

(1) Flink 的 KafkaSource 的有效并行度受到 Kafka 分区数量的限制。

(2) Flink 默认尽可能使用运算符链——这意味着在所有 100 个实例中,映射和过滤器都在与源相同的线程中运行。这避免了序列化和反序列化事件以及通过网络发送它们的开销。然而,这些源实例中只有 5 个正在消耗任何数据,因此只有 5 个链正在执行任何工作。

到目前为止,让其他 95 个任务管理器工作的最佳方法是将 Kafka 分区的数量增加到 100。如果做不到这一点,您可以显式地将 Kafka 源运算符的并行度设置为 5,并将映射的并行度设置为 5。并将过滤器设置为 100。这将强制源和映射/过滤器操作之间进行循环重新平衡。考虑到所涉及的开销,这可能会或可能不会表现得更好。

© www.soinside.com 2019 - 2024. All rights reserved.