Запуск SBT (Scala) на нескольких (кластерных) машинах одновременно
Поэтому я уже некоторое время играю с актерами Akka и написал некоторый код, который может распределять вычисления между несколькими машинами в кластере. Перед запуском "основного" кода мне нужно иметь ActorSystem
, ожидающий на каждой машине, которую я буду развертывать, и я обычно делаю это с помощью скрипта Python, который SSH входит во все машины и запускает процесс, делая что-то вроде cd /into/the/proper/folder/
, а затем sbt 'run-main ActorSystemCode'
.
Я запускаю этот скрипт Python на одной из машин (назовем ее "машина X"), поэтому я вы увидите выходные данные SSH'ING на всех других машинах в моей машине X SSH сессии. Всякий раз, когда я запускаю сценарий, кажется, что все машины заново компилируют весь код, прежде чем фактически запустить его, заставляя меня сидеть там в течение нескольких минут, прежде чем сделать что-то полезное.
Мой вопрос таков:
-
Зачем им вообще нужна повторная компиляция? Один и тот же JVM доступен на всех машинах, так что не следует ли запустить его сразу же?
-
Как мне обойти это? проблема заставить каждую машину компилировать "свою собственную копию"?
2 ответа:
Sbt - это инструмент сборки, а не средство запуска приложений. Используйте sbt-assembly для сборки all in one jar и поместите jar на каждую машину и запустите ее с помощью команды
scala
илиjava
.
Обычно кластер имеет один раздел, смонтированный на каждом узле (через NFS или samba). Вам просто нужно скопировать артефакт в этот раздел, и они будут доступны непосредственно в каждом узле. Если это не так, вы должны попросить вашего системного администратора установить его.
Затем вам нужно будет запустить приложение. Опять же, большинство кластеров приходят с MPI. Инструменты
mpirun
(илиmpiexec
) не ограничены реальными MPI-приложениями и запускают любой сценарий, который вы хотите, на нескольких узлах.