Storm-Kafka несколько носиков, как разделить нагрузку?

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

Я могу сделать то же самое с одним носиком, но я хочу разделить нагрузку на несколько носиков. Я не могу получить логику для распространения нагрузки. Поскольку смещение сообщений неизвестно до тех пор, пока конкретный носик не закончит потреблять часть (т.е. На основе установленного размера буфера).

Кто-нибудь может рассказать о том, как разработать логику/алгоритм?

Благодарим за ваше время.


Обновление в ответ на ответы:
Теперь используются многораздельные разделы на Kafka (i.e 5)
Ниже приведен код:
builder.setSpout("spout", new KafkaSpout(cfg), 5);

Протестировано путем наводнения данными 800 MB на каждом разделе, и для завершения чтения потребовалось ~22 sec.

Опять же, используется код с parallelism_hint = 1
т.е. builder.setSpout("spout", new KafkaSpout(cfg), 1);

Теперь потребовалось больше ~23 sec! Почему?

В соответствии с объявлением Storm Docs setSpout() выглядит следующим образом:

public SpoutDeclarer setSpout(java.lang.String id,
                              IRichSpout spout,
                              java.lang.Number parallelism_hint)

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

Ответ 1

Я столкнулся с обсуждением в storm-user, в котором обсуждается нечто подобное.

Прочитайте Связь между Spout parallelism и числом разделов kafka.


2 вещи, которые следует учитывать при использовании кафка-носика для шторма

  • Максимальный parallelism, который вы можете иметь на KafkaSpout, - это количество разделов.
  • Мы можем разделить нагрузку на несколько тем кафки и иметь отдельные экземпляры spout для каждого. то есть. каждый носик обрабатывает отдельную тему.

Итак, если у нас есть случай, когда разделы kafka для каждого узла настроены как 1, а число хостов равно 2. Даже если мы установим носик parallelism как 10, максимальное значение, которое будет проверено, будет только 2, которое количество разделов.


Как указать количество разделов в кафка-носике?

List<HostPort> hosts = new ArrayList<HostPort>();
hosts.add(new HostPort("localhost",9092));
SpoutConfig objConfig=new SpoutConfig(new KafkaConfig.StaticHosts(hosts, 4), "spoutCaliber", "/kafkastorm", "discovery");

Как вы можете видеть, здесь брокеры могут быть добавлены с помощью hosts.add, а номер partion указан как 4 в фрагменте кода new KafkaConfig.StaticHosts(hosts, 4).


Как упомянуть подсказку parallelism в Kafka-spout?

builder.setSpout("spout", spout,4);

Вы можете упомянуть то же самое, добавляя носик в топологию с помощью метода setSpout. Здесь 4 - подсказка parallelism.


Другие ссылки, которые могут помочь

Understanding-the-parallelism-of-a-Storm-topology

what-is-the-task-in-twitter-storm-parallelism


Отказ: !! Я новичок как в шторме, так и в java!!!! Так PLS изменить/добавить, если его требуется где-то.