Как отправить несколько приложений Spark параллельно, не создавая отдельные JVM?
Проблема в том, что вам нужно запустить отдельную JVM, чтобы создать отдельный сеанс с разным количеством оперативной памяти на задание.
Как подать несколько приложений Spark одновременно, не создавая отдельные JVM вручную?
Мое приложение запускается на одном сервере, в пределах одной JVM. Это кажется проблемой с сеансом Spark в соответствии с парадигмой JVM. Парадигма искры говорит:
1 JVM => 1 app => 1 session => 1 context => 1 RAM/executors/cores config
Мне бы хотелось иметь разные конфигурации для каждого приложения Spark без запуска дополнительных JVM вручную. Конфигурации:
spark.executor.cores
spark.executor.memory
spark.dynamicAllocation.maxExecutors
spark.default.parallelism
USECASE
Вы начали длительную работу, скажем, 4-5 часов, чтобы закончить. Работа выполняется в течение сеанса с конфигами spark.executor.memory=28GB
, spark.executor.cores=2
, Теперь вы хотите запустить 5-10 секунд работы по требованию пользователя, не дожидаясь 4-5 часов. Эта жестяная работа требует 1 ГБ оперативной памяти. Чтобы ты делал? Отправить жестяную работу от имени продолжительной сессии работы? Чем будет востребовано 28гб ((
Что я нашел
- Spark позволяет настраивать количество процессоров и исполнителей только на уровне сеанса. Пул планирования Spark позволяет скользить и нарезать кубиками только количество ядер, а не ОЗУ или исполнителей, верно?
- Spark Job Server. Но они не поддерживают Spark новее, чем 2.0, для меня это не вариант. Но они на самом деле решают проблему для версий старше 2.0. В функциях Spark JobServer они сказали
Separate JVM per SparkContext for isolation (EXPERIMENTAL)
, что значитspawn new JVM per context
- Мезос мелкозернистый режим не рекомендуется
- Это хак, но слишком рискованно использовать его в производстве.
- Скрытый API REST Apache Spark для отправки на работу, прочитайте это и это. Там определенно есть способ указать память и ядра исполнителя, но все же каково поведение при отправке двух заданий с разными конфигами? Как я понимаю, это Java REST клиент для него.
- Ливий Не знаком с ним, но, похоже, у них есть Java API только для пакетной отправки, что для меня не вариант.
2 ответа
В случае использования это теперь намного понятнее. Есть два возможных решения:
Если вам требуются общие данные между этими заданиями, используйте планировщик FAIR и внешний интерфейс (REST-) (как это делает SparkJobServer, Livy и т. Д.). Вам также не нужно использовать SparkJobServer, код должен быть относительно простым, если у вас фиксированная область видимости. Я видел, как проекты идут в этом направлении. Все, что вам нужно, это цикл обработки событий и способ перевести ваши входящие запросы в запросы Spark. В некотором смысле, я ожидаю, что будет спрос на библиотеку, чтобы покрыть этот вариант использования, так как это почти всегда первое, что вам нужно создать, когда вы работаете с Spark-ориентированным приложением / фреймворком. В этом случае вы можете определить размер ваших исполнителей в соответствии с вашим оборудованием, Spark будет управлять планированием ваших заданий. Благодаря динамическому распределению ресурсов Yarn, Yarn также освобождает ресурсы (убивает исполнителей), если ваш фреймворк / приложение простаивают. Для получения дополнительной информации читайте здесь: http://spark.apache.org/docs/latest/job-scheduling.html
Если вам не нужны общие данные, используйте YARN (или другой менеджер ресурсов), чтобы справедливо распределить ресурсы для обоих заданий. YARN имеет справедливый режим планирования, и вы можете устанавливать требования к ресурсам для каждого приложения. Если вы считаете, что это вам подходит, но вам нужны общие данные, то вы можете подумать об использовании Hive или Alluxio для обеспечения интерфейса данных. В этом случае вы должны запустить две спарк-отправки и поддерживать несколько драйверов в кластере. Построение дополнительной автоматизации на основе spark-submit поможет вам сделать это менее раздражающим и более прозрачным для конечных пользователей. Этот подход также требует больших задержек, поскольку распределение ресурсов и инициализация SparkSession занимают более или менее постоянный промежуток времени.
Я бы сказал, что это невозможно.
Приложение Spark - это как минимум одна JVM spark-submit
время, когда вы указываете требования к одной JVM (или группе JVM, которые действуют как исполнители).
Однако, если вы хотите иметь разные конфигурации JVM без запуска отдельных JVM, это не представляется возможным (даже вне Spark, но при условии, что JVM используется).