Разделитель Kafka по умолчанию создает коллизию хеш-ключа - PullRequest
0 голосов
/ 31 мая 2019

У меня есть тема с 10 разделами, и я генерирую события с A,B,C,D,E,F,G,H,I 9 различными ключами.

Я наблюдал сообщения, делающие это:

Partition 0- (Message1, Key E), (Message2, Key I)
Partition 1- (Message3, Key F) 
. 
. 
Partition7-(Message4, Key A), (Message5, Key A)
Partition8- Empty 
Partition9- Empty

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

По умолчанию разделитель Kafka создает коллизии?

Я создаю из одного потока, которыйсбалансирован до двух остальных по умолчанию производителей .

Это то, что я ожидал:

 Partition 0- (Message1, Key E)
 Partition 1- (Message3, Key F) 
 . 
 . 
 Partition7-(Message4, Key A), (Message5, Key A)
 Partition8-(Message2, Key I) 
 Partition9- Empty

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Да, секционер по умолчанию будет создавать коллизии, и это произойдет не позднее, когда у вас будет на один ключ больше, чем у вас есть разделы.Смотрите ответ @senseiwu, который хорошо объясняет, что происходит.Если у вас есть конечный набор ключей и вы хотите распределить их по тому же количеству разделов, вы должны реализовать свой собственный разделитель.

1 голос
/ 31 мая 2019

DefaultPartitioner Кафки использует алгоритм хэширования ропот на стороне клиента производителя для назначения раздела каждому сообщению. Нет гарантии, что для 10 разделов и однозначного числа ключей они будут распределены равномерно. Расчет разбиения для каждого сообщения не зависит друг от друга, и вероятность столкновения представляет математический интерес.

EDIT:

Маловероятно, что алгоритм хэша бормотания приведет к столкновению. Разделы в теме Kafka исправлены - они не могут расти в отличие от размера сегмента в реализации Java HashMap. Таким образом, алгоритм разбиения использует формулу, которая вычисляет по модулю количество разделов. Точная формула: Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;

Теперь вы можете видеть, что два разных ключа действительно могут привести к одному и тому же номеру раздела, если hash mod number of partitions приведет к одному и тому же значению.

При большом количестве случайных ключей ключи будут равномерно распределены по всем разделам.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...