Что такое "задача" в Storm parallelism

Я пытаюсь изучить твиттер, следуя замечательной статье Понимание parallelism топологии Storm

Однако я немного смущен концепцией "задачи". Является ли задача запущенным экземпляром компонента (носик или болт)? Исполнитель, имеющий несколько задач на самом деле, говорит, что один и тот же компонент выполняется несколько раз исполнителем, правильно ли я?

Кроме того, в общем смысле parallelism Storm будет генерировать выделенный поток (исполнитель) для носика или болта, но то, что внесено в parallelism исполнителем (потоком), имеющим несколько задач? Я думаю, что есть несколько задач в потоке, так как поток выполняется последовательно, только сделайте поток своего рода "кэшированным" ресурсом, который избегает нереста нового потока для запуска следующей задачи. Я прав?

Я могу устранить эту путаницу самостоятельно, потратив больше времени на исследование, но вы знаете, мы оба любим stackoverflow; -)

Спасибо заранее.

Ответ 1

Отказ от ответственности: я написал статью, на которую вы ссылались в своем вопросе выше.

Однако я немного смущен концепцией "задачи". Является ли задача запущенным экземпляром компонента (носик или болт)? Исполнитель, имеющий несколько задач на самом деле, говорит, что один и тот же компонент выполняется несколько раз исполнителем, правильно ли я?

Да и да.

Кроме того, в общем смысле parallelism, Storm будет порождать выделенный поток (исполнитель) для носика или болта, но что способствовало parallelism исполнителем (потоком), имеющим несколько задач?

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

Как я писал в статье, обратите внимание:

  • Количество потоков исполнителей может быть изменено после запуска топологии (см. команду storm rebalance).
  • Количество задач топологии статично.

И по определению существует инвариант #executors <= #tasks.

Таким образом, одна из причин наличия 2+ задач в потоке исполнителей - предоставить вам гибкость для расширения/масштабирования топологии с помощью команды storm rebalance в будущем без использования топологии в автономном режиме. Например, представьте, что вы начинаете с кластера Storm из 15 машин, но уже знаете, что на следующей неделе будут добавлены еще 10 ящиков. Здесь вы можете выбрать запуск топологии на ожидаемом уровне parallelism из 25 машин уже на 15 исходных ящиках (что, конечно, медленнее, чем 25 ящиков). После того, как будут добавлены дополнительные 10 ящиков, вы можете storm rebalance использовать топологию, чтобы полностью использовать все 25 ящиков без простоя.

Другая причина для запуска 2+ задач для каждого исполнителя - это (в основном функциональное) тестирование. Например, если ваш компьютер-разработчик или сервер CI достаточно мощный, чтобы запустить, скажем, 2 исполнителя вместе со всеми остальными файлами, запущенными на компьютере, вы все равно можете запустить 30 заданий (здесь: 15 на каждого исполнителя), чтобы узнать, может ли код, например, ваша пользовательская группировка Storm работает должным образом.

На практике мы обычно запускаем 1 задачу для каждого исполнителя.

PS: Обратите внимание, что Storm фактически вызовет еще несколько потоков за кулисами. Например, каждый исполнитель имеет свой собственный "поток отправки", который отвечает за обработку исходящих кортежей. Также существуют "потоки" на уровне "системного уровня", например. acking кортежи, которые работают рядом с вашими нитями. IIRC. Инвентарь Storm подсчитывает эти потоки привязки в дополнение к "вашим" потокам.