Как Storm управляет совместным использованием данных в кластерном режиме?

недавно я разрабатываю некоторые инструменты синхронизации для топологии шторма, но у меня все еще есть несколько вопросов об обмене данными в кластере шторма:

  1. Если компонент (носик/болт) сконфигурирован с более чем одним исполнителем на одного рабочего, скажем, номер рабочего — один, parallelism_hint компонента — 3, а номер задачи использует настройку по умолчанию (т. е. 1), значит ли это, что их 3 экземпляры компонента в воркере? Если нет, следует ли использовать поле компонента в синхронизированном блоке?

  2. Если в компоненте создается дополнительный поток с именем «athread» (в методе prepare() или open()), сколько экземпляров «athread» имеется в кластере storm?

  3. Как Понимание параллелизма топологии Storm говорит, что рабочий процесс — это отдельный процесс, а рабочий процесс выполняет подмножество топологии. Означает ли это, что глобальные переменные (например, общедоступные статические поля или другие статические переменные) топологии могут совместно использоваться только одним рабочим?

  4. Если параметр parallelism_hint воронки настроен больше 1, а в методе nextTuple() есть предложение Utils.sleep(1000), означает ли это, что количество испускаемых кортежей воронки равно числу исполнителей (потоков) воронки каждую секунду?

Большое спасибо.


person Yohn    schedule 19.05.2015    source источник
comment
Если для параметра parallelism_hint установлено значение 3, то у вас будет 3 экземпляра вашего болта, разбросанных по воркерам. Например, если у вас есть один рабочий процесс, у вас будет 3 экземпляра в одной и той же JVM. Однако, если у вас есть 3 воркера, у вас будет по одному экземпляру на JVM. Поэтому, если вы создадите новый поток в методе open()/prepare(), у вас будет столько потоков, сколько экземпляров болта. Да, статические поля совместно используются компонентами, работающими на одном рабочем потоке.   -  person fhussonnois    schedule 19.05.2015
comment
Да, вы правы, но по умолчанию Storm создает для конкретного компонента столько экземпляров, сколько исполнителей, если NumTask не установлен.   -  person fhussonnois    schedule 19.05.2015
comment
Подсказка параллелизма @fhuz указывает количество выделяемых потоков исполнителя, а не экземпляра. Ваше утверждение верно только в том случае, если вы не настроите ни одной задачи, так как в этом случае storm будет запускать 1 задачу на исполнителя (установка подсказки параллелизма = 2 создаст 2 задачи по умолчанию, если не настроено явно), в противном случае можно запустить компонент наличие одной задачи с несколькими исполнителями.   -  person user2720864    schedule 19.05.2015
comment
Да, верно . извините, я пропустил комментарий, прежде чем обновить свой   -  person user2720864    schedule 19.05.2015
comment
Спасибо @fhuz. Но мне все еще интересно, что произойдет с экземплярами компонента и связанными с ним потоками, которые он создал, когда топология перебалансируется?   -  person Yohn    schedule 20.05.2015


Ответы (1)


1) Установка подсказки параллелизма = 3 попросит Storm выделить 3 исполнителя (Threads) и создаст 3 задачи по умолчанию (обратите внимание, если вы явно не настроили количество задач, Storm будет запускать одну задачу на исполнителя по умолчанию) для этого компонента. . Если вы установите no task = 1 , то три потока будут работать с одним и тем же экземпляром компонента.

2) Предполагая, что вы работаете с настройками по умолчанию (1 исполнитель и 1 задача/компонент), будет создан один единственный экземпляр этого объекта потока, поскольку метод подготовки/открытия будет вызываться только один раз.

3) Статические переменные будут общими для всех экземпляров компонента в данном воркере.

4) Не уверен, что именно вы имеете в виду, если вы работаете с несколькими исполнителями и одной задачей, тогда, когда Thread-A спит, другой Thread-B может обрабатывать кортеж.

person user2720864    schedule 19.05.2015
comment
Большое спасибо. Я задаю четвертый вопрос, чтобы убедиться, пропорциональна ли частота испускания носика количеству исполнителей, поскольку раньше я думал, что спящий поток может обеспечить точный контроль испускаемого потока, прежде чем я узнаю, что исполнитель является исполнителем. нить. - person Yohn; 20.05.2015
comment
учтите это, если у вас есть один исполнитель и несколько задач, то это не повысит уровень параллелизма, поскольку задачи всегда выполняются последовательно. Теперь, если у вас есть несколько исполнителей/потоков и несколько задач для любого компонента, они будут выполняться параллельно... задача в топологии статична и не может быть изменена, но во время перебалансировки вы можете изменить количество исполнителей и, таким образом, настроить пропускная способность топологии. - person user2720864; 20.05.2015
comment
если вы пытаетесь сделать что-то в фиксированный интервал, вы можете посмотреть кортеж штормовых тиков - person user2720864; 20.05.2015
comment
Я знаю, что тиковый кортеж работает, но тиковый кортеж можно использовать только для выполнения каких-либо действий с фиксированным интервалом. Моя проблема в том, что мне нужно сделать некоторые статистические вещи в болте B после того, как пятно A закончило свою работу и отправило время, чтобы сделать это сигнал, в то время как сигнал не может быть отправлен всем исполнителям болта B при параллельных обстоятельствах. У Вас есть какие-то предложения? Спасибо. - person Yohn; 20.05.2015
comment
сложно определить, когда болт done в потоковом сценарии. поскольку вы должны ожидать, что топология будет работать непрерывно. Один из способов, который я мог бы придумать, - сохранить обработанный кортеж в болте A в коллекции, пока вы не решите, что это сделано, а затем выпустить весь кортеж в этой коллекции за один раз. Вы также можете посмотреть на трезубец, который обрабатывает кортежи в пакетном режиме и позволяет вам настроить размер партии. - person user2720864; 20.05.2015
comment
Большое спасибо за ваши добрые слова. Trident действительно полезен для большинства статистических задач, но моя топология немного отличается. Я пробовал много способов решить проблему, пока не встретил CoordinatedBolt, очень интересный болт. Я разработал промежуточный болт, такой как CoordinatedBolt, для отправки сигнала, и теперь он работает! - person Yohn; 22.05.2015