Как разбить разделы на подразделы?Уникальный генератор хеш-функций? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть тема Кафки с N разделами.Ключ записи - это cookie.Записи распределяются по разделам по формуле hash(key) % N.

. Я хочу обрабатывать записи из разделов параллельно.Скажем, каждый раздел имеет M работников, назначенных для обработки.Дополнительным требованием является то, что один и тот же файл cookie обрабатывается одним рабочим потоком (для поддержания порядка событий).

Я не знаю, какую функцию hash использовали для разделения записей.Вычисления my_hash(key) % M могут не работать должным образом, если я использую my_hash == hash и gcd(N, M) > 1 (особенно когда N = M).

Поскольку я знаю partitionId для всех записей, моей первоначальной идеей было вычисление my_hash(key + "." + partitionId) % M но мне интересно, достаточно ли хорош этот вид ведра.Есть вероятность, что hash(key) == h1(key + "." + (h2(key) % N)) == my_hash(key + "." + partitionId).

Думаю, мне нужно сгенерировать уникальную хеш-функцию.Знаете ли вы такие генераторы?

РЕДАКТИРОВАТЬ

Пример:

Partition1: (cookie1, ...), (cookie1, ...), (cookie3, ...)
Partition2: (cookie2, ...), (cookie2, ...), (cookie4, ...)

Я хочу, чтобы 2 потока (N = M) обрабатывали каждый раздел,Я не знаю функцию hash, поэтому может случиться так, что я выберу my_hash == hash.

Тогда я получу:

Partition1_Subpartition1: (cookie1, ...), (cookie1, ...), (cookie3, ...)
Partition1_Subpartition2: <always_empty>
Partition2_Subpartition1: <always_empty>
Partition2_Subpartition2: (cookie2, ...), (cookie2, ...), (cookie4, ...)

Вместо этого возможно лучшее разделение, например:

Partition1_Subpartition1: (cookie3, ...)
Partition1_Subpartition2: (cookie1, ...), (cookie1, ...)
Partition2_Subpartition1: (cookie4, ...)
Partition2_Subpartition2: (cookie2, ...), (cookie2, ...)

1 Ответ

0 голосов
/ 28 ноября 2018

Потребитель Kafka должен работать в своем отдельном потоке.Невозможно (или не рекомендуется) разделять тему между несколькими потребителями.Итак, если у вас есть M потоков, это означает, что у вас есть M потребителей.Теперь перейдем к вашему требованию:

Я хочу прочитать тему параллельно с M-потоками, чтобы все записи с одним и тем же файлом cookie читались одним потоком.

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

Я хочу, чтобы 2 потока (N = M) обрабатывали каждый раздел.

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

Теперь вы пытаетесь перенаправить определенный ключ (cookie) в разные разделы, основываясь на какой-то функции(может быть, отметка времени или что-то еще), и если вы знаете, что он может перейти к любому из разделов в наборе (p1, p2, ... pn), то вы хотите, чтобы один потребитель использовал все эти n разделов?Тогда что бы вы выиграли по сравнению с ситуацией, если бы все вхождения одного и того же куки-файла попали в один и тот же раздел?Потому что, в конце концов, это тот же потребительский поток Kafka, который его потребляет.И в том же духе, я думаю, что если ваш потребительский поток Kafka делегирует задание обработки пулу потоков (о котором вы, возможно, говорите), то также не имеет значения, используете ли вы один и тот же ключ из одного раздела или из набора разныхразделы, размер пула потоков будет определять, насколько вы достигнете параллелизма.

...