2013-08-16 5 views
10

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

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

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

Advance Спасибо за ваше время.


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

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

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

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

Согласно Сторм Docs setSpout() декларации заключается в следующем:

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

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

ответ

17

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

Прочитано Relationship between Spout parallelism and number of kafka partitions.


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

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

Итак, если у нас есть случай, когда разделы kafka на хост конфигурируются как 1, а количество хостов равно 2. Даже если мы установим параллельность слизи как 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 определяется как в new KafkaConfig.StaticHosts(hosts, 4) фрагменте кода.


Как отметить параллелизм намек на Кафки-носик?

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

Вы можете упомянуть то же самое, добавляя свой носик в топологии, используя setSpout метод. Здесь - это подсказка о параллельности.


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

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

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


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

+3

Ох ... вы отправлены богом. Вы спасли мою жизнь. У меня было 5 разделов kafka, и я установил parallelism_hint из 3 в setSpout() и задавался вопросом, почему моя топология читается только из 3 разделов kafka после того, как параметр parallelism_hint решил 5 решить мою проблему. Спасибо за указание на это. – Shams