У самих 2 различных варианта:
1) простейший ui который интегрирован с livy, закинул Jar, выбрал спарк версию, отправил submit. (это если нужно какое-то специфические действие)
2) sbt plugin sparkDeploy. Всё спарк версии лежат на hdfs, заливает отдельным Jar все депенденси (чтобы закешировать и по сто раз не лить, если не менял депенденси то зачем перезаливать ещё раз этот жирный jar ), jar уже с твоим кодом из проекта.
По запросу run/deploy делаем корректный xml с путями к спарку, зависимостям, твоему коду (большую часть времени только твой код и меняется, поэтому заливать по минимуму), и сабмитим в oozie или сразу на выполнение, или на скедулинг и периодическое выполнение