Ошибка вида spark.master не задан или сообщение «System type spark not recognized» при запуске приложения почти всегда указывает на то, что среда не понимает, в каком режиме должен работать Apache Spark — локальном или кластерном. Этот параметр определяет, где будут выполняться задачи: на вашем компьютере или на распределённом кластере серверов.
Термин «system type» в контексте Spark обычно относится к типу развёртывания системы: local, standalone, YARN, Mesos или Kubernetes. Понимание различий между ними критично, потому что от выбора режима зависят конфигурация, требования к ресурсам и способы диагностики сбоев. В статье разберём каждый тип, порядок проверки настроек и типичные ошибки запуска.
Что означает system type в Apache Spark
Apache Spark — это распределённый вычислительный движок, и ему нужен менеджер кластера, который выделяет ресурсы под задачи. Параметр spark.master как раз и задаёт «тип системы»: куда драйвер приложения должен подключаться для запуска исполнителей.
Если вы запускаете код через spark-submit или из IDE без явного указания мастера, Spark пытается взять значение из переменных окружения или конфигурационных файлов. Когда значение отсутствует или указано неверно, приложение падает ещё на этапе инициализации контекста.
Проверить текущий режим можно прямо в коде: метод spark.sparkContext.master вернёт строку вида local[*] или spark://host:7077. Это первый диагностический шаг при любых проблемах с запуском.
«System type» в Spark — это режим работы мастера (local, standalone, YARN, Kubernetes), задаваемый параметром spark.master. Ошибки запуска чаще всего связаны именно с его отсутствием или неверным значением.
Основные типы развёртывания Spark
Существует несколько устоявшихся режимов работы. Каждый подходит под свой сценарий — от локальной отладки до промышленных кластеров.
- 🔧 Local mode — всё выполняется в одном JVM-процессе на вашей машине. Указывается как
local,local[N](N потоков) илиlocal[*](все доступные ядра). Идеален для разработки и тестов. - 🖥️ Standalone — встроенный кластерный менеджер Spark. Мастер запускается на одном узле, воркеры — на остальных. Адрес имеет вид
spark://host:7077. - 🏗️ YARN — менеджер ресурсов экосистемы Hadoop. Spark-приложение работает поверх существующего Hadoop-кластера, что удобно, если инфраструктура уже развёрнута.
- ☸️ Kubernetes — исполнители поднимаются как поды в K8s-кластере. Современный вариант для облачных сред.
Выбор зависит от инфраструктуры, а не от «качества» режима. Для одиночного ноутбука любой кластерный режим бессмысленен, а для продакшена с сотнями узлов local-режим просто не масштабируется.
Сравнение режимов работы
| Режим | Значение master | Типичный сценарий | Требования |
|---|---|---|---|
| Local | local[*] | Разработка, отладка, обучение | Только установленный Spark |
| Standalone | spark://host:7077 | Небольшой выделенный кластер | Запущенные master и worker |
| YARN | yarn | Кластер Hadoop в компании | Настроенный Hadoop/YARN |
| Kubernetes | k8s://https://api:443 | Облачные и контейнерные среды | Доступный K8s-кластер |
Обратите внимание: точные порты и форматы адресов могут отличаться в зависимости от конфигурации конкретного кластера. Сверяйтесь с документацией вашей версии Spark и настройками инфраструктуры.
Как проверить и задать тип системы
Начните с безопасной проверки: запустите интерактивную оболочку и посмотрите, какой мастер подхватился по умолчанию.
spark-shell
scala> spark.sparkContext.master
Если нужно задать режим явно, есть несколько способов. При запуске через spark-submit используется флаг:
spark-submit --master local[4] --class MainApp app.jar
Внутри кода приложения мастер задаётся через конфигурацию:
val conf = new SparkConf().setMaster("local[*]").setAppName("MyApp")
Альтернативный вариант — переменная окружения MASTER или параметр в файле spark-defaults.conf. Приоритет обычно такой: явный код в приложении переопределяет флаги командной строки, а те, в свою очередь, переопределяют файл конфигурации.
☑️ Проверка конфигурации Spark перед запуском
⚠️ Внимание: если мастер задан одновременно в коде и черезspark-submit, значение из кода обычно побеждает. Это частая причина ситуации, когда приложение «игнорирует» кластер и запускается локально — проверьте, не зашит лиsetMaster("local")в исходниках.
Типичные ошибки и их причины
Рассмотрим сбои, которые чаще всего связаны именно с типом системы. Возможная причина в каждом случае — несоответствие между заданным режимом и реальной инфраструктурой.
- ⚡ «Master URL must be set» — мастер не задан нигде. Решение: указать
--masterилиsetMaster(). - 🔌 Connection refused к spark://host:7077 — standalone-мастер не запущен или недоступен по сети. Проверьте процесс мастера и файрвол.
- 🧩 ClassNotFoundException в кластерном режиме — JAR с приложением не доставлен на исполнители. Проверьте упаковку зависимостей.
- 💾 OutOfMemory в local-режиме — одна JVM не справляется с объёмом данных. Увеличьте память драйвера или уменьшите выборку для теста.
Отдельный случай — путаница между deploy mode (client и cluster). Это не тип системы, а способ размещения драйвера: на вашей машине или внутри кластера. Путать эти понятия не стоит, хотя оба задаются при запуске.
Почему local[*] не подходит для продакшена
В local-режиме драйвер и исполнители живут в одном процессе на одной машине. Нет отказоустойчивости на уровне узлов, нет распределения нагрузки, а объём данных ограничен памятью одного сервера. Для обучения этого достаточно, но реальные большие данные требуют кластерного менеджера.
Требования к окружению
Для корректной работы любого режима необходимо базовое окружение. Вам нужна установленная Java совместимой версии — конкретный список поддерживаемых версий зависит от релиза Spark, поэтому сверяйтесь с официальной документацией именно вашей версии.
Переменные окружения JAVA_HOME и SPARK_HOME должны указывать на корректные каталоги, а в PATH желательно добавить bin-каталог Spark, чтобы команды spark-shell и spark-submit были доступны из любого места.
Проверьте совместимость версий заранее: команда java -version и файл документации вашего релиза Spark сэкономят часы отладки загадочных ошибок при старте.
⚠️ Внимание: на Windows запуск Spark часто требует дополнительной утилиты winutils.exe и переменной HADOOP_HOME, даже если Hadoop не используется. Без неё возможны ошибки доступа к файловой системе. Это специфика платформы, а не признак сломанной установки.
Диагностика при неудачном запуске
Действуйте от простого к сложному. Сначала проверьте, запускается ли вообще spark-shell в режиме по умолчанию — если да, проблема в параметрах вашего приложения, а не в установке.
Затем посмотрите логи. В local-режиме они выводятся в консоль, в standalone — в каталоге logs или work установки Spark, в YARN — через веб-интерфейс ResourceManager. Строка с первым исключением в логе почти всегда содержит реальную причину сбоя, даже если поверх неё навалены десятки вторичных ошибок.
Если кластерный мастер недоступен, проверьте сетевую связность: разрешается ли имя хоста, открыт ли порт, нет ли между машинами файрвола. Для Kubernetes дополнительно проверьте права сервисного аккаунта, от имени которого создаются поды.
Диагностика строится по цепочке: значение spark.master → доступность мастера → логи с первым исключением → проверка версий Java и Spark. Большинство проблем решается на первых двух шагах.
Часто задаваемые вопросы
Что означает local[*] в параметре master?
Звёздочка означает использование всех доступных логических ядер процессора. Запись local[4] ограничит выполнение четырьмя потоками, а просто local — одним.
Можно ли менять режим без переписывания кода?
Да, если мастер не зашит в коде через setMaster(). Передавайте режим через --master при запуске или через spark-defaults.conf — тогда один и тот же JAR работает и локально, и в кластере.
Чем standalone отличается от YARN?
Standalone — встроенный менеджер самого Spark, простой в развёртывании. YARN — часть экосистемы Hadoop, позволяет делить ресурсы кластера между Spark и другими инструментами. Выбор зависит от существующей инфраструктуры.
Почему приложение запускается локально, хотя указан кластер?
Возможная причина — вызов setMaster("local") в коде, который переопределяет внешние параметры. Проверьте исходники и уберите жёсткое задание мастера.
Нужен ли Hadoop для работы Spark?
Нет, Spark работает и без Hadoop — в local и standalone режимах. Hadoop-компоненты нужны только для YARN или доступа к HDFS.