Архитектура Spark
Apache Spark — это распределенный движок обработки данных, предназначенный для выполнения задач в области Data engineering, Data science и Machine learning на больших кластерах данных. Основные преимущества Spark:
-
Высокая скорость обработки данных благодаря вычислениям в памяти.
-
Унифицированный API для аналитики. Spark предоставляет единую платформу для пакетной обработки данных, потоковой обработки в режиме реального времени и интерактивных запросов.
-
Поддержка SQL. Позволяет использовать ANSI SQL для работы с датасетами.
-
Поддержка нескольких языков программирования. Spark предоставляет API для популярных языков, таких как Java, Scala, Python и R.
-
Встроенные инструменты машинного обучения. Библиотека MLlib предоставляет широкий набор инструментов для машинного обучения над большими распределенными датасетами.
Компоненты
Ниже приведена высокоуровневая архитектурная схема Spark.
Основные концепции Spark:
-
Приложение (application). Пользовательская программа, написанная с использованием Spark API. Spark поддерживает приложения на Python, Scala, Java и R.
-
Кластерный менеджер (cluster manager). Система, которая выделяет ресурсы кластера приложению Spark (например, YARN).
-
Драйвер (driver). Процесс, в котором запускается метод
main()приложения Spark и создается объектSparkContext. -
SparkContext. Ключевой объект Spark API, используемый для взаимодействия с кластером Spark из кода приложения. Выполнение любого Spark-приложения начинается с создания экземпляра
SparkContext. После инициализации данный объект используется для взаимодействия с кластерным менеджером, отслеживания состояния исполнителей, мониторинга статуса задач и планов выполнения. -
Рабочий узел (worker node). Машина, на которой запускаются Spark-исполнители.
-
Исполнитель (executor). JVM-процесс, запускаемый на рабочем узле для выполнения части вычислений приложения Spark. Каждое приложение получает свой собственный набор исполнителей.
-
Задание (task). Единица работы, отправляемая одному исполнителю.
-
Задача (job). Последовательность вычислений, необходимых для выполнения действия Spark (например,
save(),collect()и другие). -
Этап (stage). Каждая задача состоит из набора подзадач, называемых этапами, которые зависят друг от друга (аналогично этапам map/reduce в MapReduce).
Драйвер и исполнители
Архитектура Spark реализует парадигму "мастер-исполнитель". При запуске приложения Spark создает следующие внутренние процессы:
-
Драйвер (мастер). Процесс, который запускает метод
main()приложения Spark, взаимодействует с менеджером кластера и отправляет задачи исполнителям. -
Исполнители. Исполнитель — это процесс, который выполняет задачи от драйвера, хранит данные в памяти/на диске и отправляет результаты вычислений обратно драйверу. При запуске приложения Spark создает несколько исполнителей на доступных узлах кластера. Распределение исполнителей осуществляется автоматически с помощью кластерного менеджера (YARN). Объем ресурсов, выделяемых для каждого исполнителя, можно регулировать.
Расположение драйвера и исполнителей в кластере Spark выполняется автоматически и зависит от режима деплоя Spark.
Режимы деплоя Spark
Spark поддерживает два режима деплоя (deploy mode), которые определяют, где выполняется процесс драйвера.
Режим деплоя можно указать с помощью параметра --deploy-mode [client|cluster] при запуске приложения, например:
./bin/spark3-submit
--deploy-mode [client|cluster]
...
mySparkApp.jar
Ключевые различия между этими двумя режимами описаны ниже.
| Характеристика | Режим клиента | Режим кластера |
|---|---|---|
Расположение процесса драйвера |
Выполняется на клиентской машине вне кластера Spark — там же, где было запущено приложение Spark |
Выполняется на одном из рабочих узлов Spark-кластера. Кластерный менеджер выбирает узлы автоматически |
Управление ресурсами |
Клиентская машина отвечает за управление процессом драйвера |
Кластерный менеджер отвечает за управление процессом драйвера |
Сетевой трафик |
Предполагает активную коммуникацию между клиентским компьютером, кластерным менеджером и исполнителями (передача shuffle-файлов, файлов приложения JAR/Python с зависимостями, Spark DAG, задачи и так далее). Для этого клиентская машина должна иметь быстрое и стабильное сетевое соединение с инфраструктурой Spark-кластера |
Активная коммуникация между клиентским компьютером и кластерным менеджером происходит в основном сразу после запуска приложения. После этого сетевой трафик между клиентской машиной и Spark-кластером минимален |
Отказоустойчивость |
Имеет меньшую отказоустойчивость по сравнению с кластерным режимом. Если клиентская машина выходит из строя вместе с процессом драйвера, работа всего Spark-приложения останавливается |
Более отказоустойчивый режим, поскольку процесс драйвера выполняется на узле кластера под управлением YARN. В случае сбоя узла с драйвером YARN автоматически перезапускает контейнер драйвера |
Применимость |
Кейсы, подразумевающие интерактивную разработку/тестирование, где важны быстрота итераций и возможность отладки. Режим также применим для небольших приложений Spark или при ограниченных ресурсах |
Производственная среда, где критически важны масштабируемость, отказоустойчивость и изоляция ресурсов. Данный режим следует выбирать для эффективной работы крупномасштабных задач по обработке данных |
|
ПРИМЕЧАНИЕ
Если режим деплоя не указан явно при запуске приложения, Spark стартует в клиентском режиме.
|
Процесс выполнения
Ниже описаны этапы выполнения приложения в Spark-кластере.
-
Драйвер Spark создает объект
SparkContext. В зависимости от режима деплоя Spark-драйвер запускается:-
или внутри процесса Application Master, который управляется YARN (режим кластера);
-
или как отдельный клиентский процесс, а Application Master используется только для запроса ресурсов у YARN (режим клиента).
-
-
SparkContextобращается к YARN для создания исполнителей. YARN запускает контейнеры для Spark-исполнителей на узлах кластера с компонентами YARN NodeManager. -
Каждый исполнитель регистрируется на стороне драйвера, уведомляя о своей готовности к выполнению задач.
-
При выполнении трансформации (transformation) Spark создает или модифицирует логический план в виде DAG. Поскольку Spark-трансформации являются "ленивыми", на этом этапе фактическая работа кластером не выполняется. Пример трансформации:
val filtered_students = df.filter($"age" > 18) -
Для выполнения действия (action) Spark инициирует вычисления согласно DAG-плану. Пример операции типа action:
filtered_students.count() -
Драйвер оптимизирует логический план, а затем преобразует его в физический план. На этом этапе выполняются оптимизации, например pushdown.
-
DAG Scheduler разбивает задачи (job) на этапы (stage).
-
Драйвер генерирует задания (task) и планирует их выполнение. Отдельные задания сериализуются и направляются исполнителям через TaskScheduler. Исполнители выбираются на основе локальности данных, доступных ресурсов и так далее.
-
Исполнители выполняют полученные задания. Каждый исполнитель считывает входные блоки данных, выполняет логику трансформаций для отдельной партиции и при необходимости записывает shuffle-файлы. Статус выполнения отправляется обратно драйверу.
-
Драйвер собирает результаты от исполнителей, и работа приложения Spark завершается. Для операций действия (Spark action) типа
count()результаты выполнения задач агрегируются на стороне драйвера. При необходимости записи данных исполнители напрямую записывают данные в HDFS/S3.
Сервис Spark в ADH
В ADH движок Spark доступен в виде отдельного сервиса (Spark3 или Spark4, где число указывает версию ядра движка). После добавления сервиса в ADH-кластер, Spark готов к работе.
Сервисы Spark включают следующие компоненты:
-
Spark client. Включает основные библиотеки для выполнения Spark-приложений.
-
Spark Connect. Выполняет функцию шлюза для удаленного подключения к Spark-кластерам.
-
Spark History Server. Предоставляет веб-интерфейс с подробной информацией о завершенных приложениях Spark.
-
Spark Livy Server. RESTful-сервис, позволяющий отправлять задачи Spark по HTTP.
Коннекторы Spark
Дистрибутив Spark, доступный в ADH, дополнительно включает коннекторы, которые позволяют интегрироваться с продуктами Arenadata, а именно:
Кластерный менеджер
Кластерный менеджер отвечает за распределение ресурсов (CPU/RAM) между компонентами Spark для выполнения приложений. Технически Spark поддерживает различные кластерные менеджеры, такие как Mesos и Kubernetes, однако в ADH сервис Spark преднастроен для работы с YARN. В ADH данный кластерный менеджер используется по умолчанию и не требует настройки со стороны Spark.
Сравнение Spark4 и Spark3
Версия ядра Spark 4 содержит значительные изменения по сравнению с Spark 3.x, обеспечивающие повышенную производительность, надежность и удобство для разработчиков Spark-приложений. Полный список новых функций доступен в Apache Spark release notes. Ниже приводится краткое описание основных нововведений.
-
Соответствие стандарту ANSI SQL по умолчанию. В Spark4 по умолчанию активен режим ANSI, что дает следующие преимущества:
-
При неудачном SQL-запросе выбрасывается исключение вместо возвращаемого
NULL. -
Более строгая проверка типов.
-
Обеспечение корректности записываемых данных за счет отклонения операций вставки в случае неправильного преобразования данных.
-
-
Улучшения в типах данных:
-
Добавление типа данных
VARIANT. Значительно повышает эффективность обработки полуструктурированных данных, в частности JSON. -
Поддержка коллации (string collation). Обеспечивает более точное сравнение и сортировку строк с учетом настроек локалей.
-
-
Улучшения экосистемы Python:
-
Источники данных (data source) Python. Встроенные возможности позволяют разработчикам создавать пользовательские источники данных полностью на языке Python.
-
Поддержка полиморфных пользовательских табличных функций (User-Defined Table Function, UDTF) на Python. Полиморфные пользовательские табличные функции позволяют более гибко преобразовывать данные и дают возможность повторного использования кода.
-
-
Улучшения Spark Connect:
-
Spark4 представляет новый облегченный Python-клиент, значительно сокращающий объемы контейнеров при развертывании.
-
Улучшены схемы удаленного подключения.
-
-
Улучшения в области потоковой передачи и управления состоянием:
-
Spark 4 предоставляет доступ к параметрам состояния (state) потоковой передачи данных для отладки и мониторинга.
-
Расширены возможности устранения неполадок для сложных потоковых пайплайнов.
-
-
Улучшения отладки. Реализация структурированного логирования с использованием JSON позволяет генерировать машиночитаемые логи для автоматической обработки. Обеспечивает лучшую интеграцию с современными системами агрегации логов.