Я пытаюсь поделиться этой задачей между несколькими носиками. У меня есть ситуация, когда я получаю один кортеж/сообщение за раз из внешнего источника, и я хочу иметь несколько экземпляров носика, основной целью является совместное использование нагрузки и повышение эффективности работы.
Я могу сделать то же самое с одним носиком, но я хочу разделить нагрузку на несколько носиков. Я не могу получить логику для распространения нагрузки. Поскольку смещение сообщений неизвестно до тех пор, пока конкретный носик не закончит потреблять часть (т.е. На основе установленного размера буфера).
Кто-нибудь может рассказать о том, как разработать логику/алгоритм?
Благодарим за ваше время.
Обновление в ответ на ответы:
Теперь используются многораздельные разделы на 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 - количество задач, которые должны быть назначены для выполнения этого носика. Каждая задача будет выполняться в потоке в процессе где-то вокруг кластера.