Я создаю прототип потокового приложения Flink на голом кластере из 15 машин. Я использую пряжу с 90 слотами для задач (15x6).
Приложение считывает данные из одной темы Kafka. В теме Kafka 15 разделов, поэтому я также установил параллелизм исходного оператора равным 15. Однако я обнаружил, что Flink в некоторых случаях назначает 2-4 экземпляра задачи потребителя одному и тому же диспетчеру задач. Это приводит к тому, что определенные узлы становятся привязанными к сети (тема Kafka обслуживает большой объем данных, а машины имеют только сетевые адаптеры 1G) и узкие места во всем потоке данных.
Есть ли способ «заставить» или иным образом проинструктировать Flink равномерно распределить задачу между всеми диспетчерами задач, возможно, циклически? А если нет, есть ли способ вручную назначать задачи конкретным слотам диспетчера задач?
Насколько мне известно, это невозможно. Диспетчер заданий, который распределяет задачи по слотам задач, знает только о слотах задач. Он не знает, что одни слоты задач принадлежат одному диспетчеру задач, а другие - другому диспетчеру задач.
Flink не позволяет вручную назначать слоты задач, так как в случае обработки сбоя он может распределить задачу между оставшимися диспетчерами задач.
Однако вы можете распределить рабочую нагрузку равномерно, установив cluster.evenly-spread-out-slots: true
в flink-conf.yaml
.
Это работает для Flink> = 1.9.2.
Чтобы он работал, вам также может потребоваться установить: taskmanager.numberOfTaskSlots
равен количеству доступных процессоров на машину, а parallelism.default
равен общему количеству процессоров в кластере.