我正在一个由 15 台机器组成的裸机集群上对 Flink 流应用程序进行原型设计。我使用的是带有 90 个任务槽 (15x6( 的纱线模式。
该应用程序从单个 Kafka 主题读取数据。Kafka 主题有 15 个分区,因此我也将源运算符的并行度设置为 15。但是,我发现 Flink 在某些情况下将 2-4 个消费者任务实例分配给同一个任务管理器。这会导致某些节点受网络限制(Kafka 主题提供大量数据,而计算机只有 1G NIC(和整个数据流中的瓶颈。
有没有办法"强制"或以其他方式指示 Flink 在所有任务管理器中均匀分配任务,也许是循环?如果没有,有没有办法手动将任务分配给特定的任务管理器插槽?
据我所知,这是不可能的。将任务调度到任务槽中的作业管理器仅知道任务槽。它不知道某些任务槽属于一个任务管理器,而其他任务槽属于另一个任务管理器。
Flink 不允许手动分配任务槽,因为在处理故障的情况下,它可以将任务分发给剩余的任务管理器。
但是,您可以通过在flink-conf.yaml
中设置cluster.evenly-spread-out-slots: true
来均匀分配工作负载。 这适用于 Flink>= 1.9.2。
要使其正常工作,您可能还必须设置:taskmanager.numberOfTaskSlots
等于每台计算机的可用 CPU 数,parallelism.default
等于群集中的 CPU 总数。