Kafka Streams: поток темы против раздела нескольких тем - PullRequest
1 голос
/ 28 октября 2019

Предположим, у меня есть 2 темы: xyz1, xyz2, каждая из которых имеет 3 раздела. Если у меня есть одно потоковое приложение Kafka, имеющее 3 потока, может ли произойти следующий сценарий?

Thread                  Partition
    1       xyz1-partition 0, xyz2-partition 2
    2       xyz1-partition 1, xyz2-partition 0
    3       xyz1-partition 2, xyz2-partition 1

вместо:

Thread                  Partition
    1       xyz1-partition 0, xyz2-partition 0
    2       xyz1-partition 1, xyz2-partition 1
    3       xyz1-partition 2, xyz2-partition 2

По сути, один поток потребляет данные из определенногораздел на 2 разные темы и номер раздела может быть разным? Предполагая, что мы используем низкоуровневый процессор API

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Зависит от

Обычный потребитель Kafka:

Группа потребителей Kafka состоит из пула потребителей / экземпляров / процессов с одним и тем же group.id, который может работать на одном компьютереили распределенные машины. Kafka Consumer использует перебалансировку для назначения разделов каждому потребителю без наложения, что означает, что одному разделу может быть назначен не более одного потребительского процесса Consumer Group.

Для потребителя также можно вручную назначать определенные разделы (аналогично старым)простой «потребитель» с помощью assign (Collection). В этом случае динамическое назначение разделов и координация групп потребителей будут отключены

Таким образом, в случае, если раздел может быть назначен любому потоку при перебалансировке.

enter image description here

Поток Кафки:

Кафка использует задачу потока в качестве логической единицы для назначения раздела и распараллеливания процесса. Kafka Stream создает номер потоковой задачи на основе потоковых разделов и назначает список разделов для каждой задачи. После того, как задача назначена разделам, она будет придерживаться и управлять параллелизмом в своей собственной топологии. В результате задачи потока результатов могут обрабатываться независимо и параллельно без ручного вмешательства.

Реализация по умолчанию интерфейса PartitionGrouper, который группирует разделы по идентификатору раздела. Операции соединения требуют, чтобы разделы объединяющихся сущностей были разделены на части, т. Е. Были разделены одним и тем же ключом и имели одинаковое количество разделов. Совместное распределение обеспечивается наличием одинакового количества разделов в объединенных темах и использованием сериализации и разделителя по умолчанию для производителя. здесь

Так что в вашем случае сценарий-1 невозможен, еслиВозможен сценарий 2.

enter image description here

2 голосов
/ 28 октября 2019

Если сценарий может возникнуть или нет, зависит от вашей топологии.

На самом деле потоковые задачи назначаются потоковым потокам, а не простым разделам. Каждая задача может обрабатывать группу разделов. Одна группа содержит один или несколько разделов. Если группа содержит несколько разделов, она всегда содержит одни и те же разделы (то есть разделы с одинаковым номером раздела) разных тем. Например, группа может содержать xyz1-раздел 0, xyz2-раздел 0, но не xyz1-раздел 0, xyz2-раздел 2. Это предполагает, что разные темы используют одну и ту же стратегию разделения. Такое совместное разбиение одних и тех же разделов разных тем необходимо, например, в случае объединения, когда записи с одним и тем же ключом должны обрабатываться той же потоковой задачей, как и во втором сценарии.

Если вы предполагаете, что в первом примере каждый раздел обрабатывается другой потоковой задачей, т. Е. Каждая группа разделов содержит один раздел, сценарий может возникнуть.

Если вы предполагаете, что оба раздела в каждой строке обрабатываются одной и той же потоковой задачей (т.е. оба раздела являются частью одной и той же группы разделов), сценарий не может возникнуть, поскольку группы разделов не могут содержать разные разделы.

Для получения дополнительной информации о стратегии назначения см. https://github.com/apache/kafka/blob/e4262471c9aee4a4c04dd04ebbdbdba7e3c5ead1/streams/src/main/java/org/apache/kafka/streams/processor/internals/StreamsPartitionAssignor.java#L297

Сказал, что на самом деле существует способ назначить разные разделы одной и той же задаче с помощью интерфейса PartitionGrouper. Однако этот интерфейс будет устаревшим в версии 2.4 и удален в версии 3.0. См https://cwiki.apache.org/confluence/display/KAFKA/KIP-528%3A+Deprecate+PartitionGrouper+configuration+and+interface.

...