我有一个flink作业,从一个有5个分区的数据源读取。我在配置文件中将每个任务管理器的并行度设置为100。
在我的输入操作中,它只使用了5/100的任务管理器来读取5个分区。但在那之后,在我的map和filter操作中,我希望Flink获取它之前读取的数据,并将其分发给100个任务管理器中的每一个。但事实并非如此。它只在Map和过滤操作中将数据发送到5/100的任务管理器。剩下的95/100根本没有使用。
如何强制flink使用所有任务管理器?
我有一个flink作业,从一个有5个分区的数据源读取。我在配置文件中将每个任务管理器的并行度设置为100。
在我的输入操作中,它只使用了5/100的任务管理器来读取5个分区。但在那之后,在我的map和filter操作中,我希望Flink获取它之前读取的数据,并将其分发给100个任务管理器中的每一个。但事实并非如此。它只在Map和过滤操作中将数据发送到5/100的任务管理器。剩下的95/100根本没有使用。
如何强制flink使用所有任务管理器?
1条答案
按热度按时间bn31dyow1#
有几个因素影响到这一点:
(1)Flink的KafkaSource的有效并行性受到Kafka分区数量的限制。
(2)Flink默认情况下尽可能使用操作符链接--这意味着在所有100个示例中,map和filter都在与源代码相同的线程中运行。这避免了序列化和重新序列化事件以及通过网络发送事件的开销。但是,这些源示例中只有5个在消耗数据,因此只有5个链在做任何工作。
到目前为止,让其他95个任务管理器工作的最佳方法是将Kafka分区的数量增加到100个。如果做不到这一点,您可以显式地将Kafka源操作符的并行度设置为5,将map和filter的并行度设置为100。这将强制在源和Map/过滤操作之间进行循环再平衡。考虑到所涉及的开销,这可能会或可能不会表现得更好。