Флинк, как правильно установить параллелизм при использовании нескольких источников Кафки? - PullRequest
2 голосов
/ 13 марта 2019

Я до сих пор не могу получить четкое представление о параллелизме, скажем, у нас есть кластер Flink, в котором достаточно слотов.В нашей работе Flink мы используем 3 темы kafka из 3 разных кластеров kafka, каждая тема имеет 10 разделов.

Если мы хотим использовать сообщение как можно скорее.Каким должен быть параллелизм?

Если мы установим параллелизм на 10, тогда будет использовано 10 слотов, это означает, насколько я понимаю, 10 потоков правильно?Если эти 10 потоков «соединяются» с topic_1, то нет темы, читающей topic_2 и topic_3.

Если мы установим параллелизм на 30, тогда будет 30 потоков, но будут ли эти 30 потоков достаточно умными, чтобы 10из них перейдите в topic_1, и 10 из них перейдут в topic_2, а остальные 10 перейдут в topic_3?

1 Ответ

2 голосов
/ 13 марта 2019

Kafka Потребительские группы

Каждый потребитель Kafka принадлежит к группе потребителей, то есть ее можно рассматривать как логический контейнер / пространство имен для группы потребителей. Группа потребителей может получать сообщения из одной или нескольких тем. Экземпляры в группе потребителей могут получать сообщения с нуля, одного или нескольких разделов в каждой теме (в зависимости от количества разделов и экземпляров потребителей)

enter image description here

Как разделы Kafka назначаются работникам Flink?

В Kafka каждому потребителю из той же группы потребителей назначается один или несколько разделов. Обратите внимание, что два потребителя не могут использовать один и тот же раздел. Количество потребителей Flink зависит от параллелизма Flink, что означает, что каждая задача Flink (мы примерно рассматриваем каждую задачу Flink = слоты Flink = параллелизм Flink = доступное ядро ​​ЦП) может выступать в качестве отдельного потребителя в группе потребителей. Кроме того, вы должны заметить, что разделы - это просто абстракция для группировки разделов и данных: только внутренние разделы назначаются экземплярам параллельных задач Flink в соответствии со следующей схемой.

Возможны три случая:

1. kafka разделы == flink параллелизм

Этот случай идеален, поскольку каждый потребитель заботится об одном разделе. Если ваши сообщения сбалансированы между разделами, работа будет равномерно распределена между операторами Flink

2. kafka разделы <параллель flink </em>

Когда заданий Flink больше, чем разделов Kafka, некоторые потребители Flink просто бездействуют, не читая никаких данных:

enter image description here

В этом случае, когда у вас более высокий параллелизм, чем количество разделов (потому что вы хотите использовать его в будущем операторе), вы можете сделать .rebalance() после источника Kafka. Это гарантирует, что все операторы после источника Kafka получат равномерную нагрузку за счет необходимости перераспределения данных (так что де / сериализация + сетевые издержки).

3. перегородки кафки> параллель flink

Когда разделов Kafka больше, чем задач Flink, потребительские экземпляры Flink будут подписываться на несколько разделов одновременно:

enter image description here

Во всех случаях Flink оптимально назначит задачи разделам. В вашем случае вы можете создать несколько групп потребителей Kafka, используя соединитель Flink Kafka, и назначать ему темы (например, с помощью Regex). Таким образом, если Flink имеет три группы потребителей с 10 разделами в каждой, назначая 30 рабочих мест (ядро) для Flink Job Manager, вы можете достичь идеального случая.

Refrences: 1 , 2 , 3

...