Архитектура Spark

Apache Spark — это распределенный движок обработки данных, предназначенный для выполнения задач в области Data engineering, Data science и Machine learning на больших кластерах данных. Основные преимущества Spark:

  • Высокая скорость обработки данных благодаря вычислениям в памяти.

  • Унифицированный API для аналитики. Spark предоставляет единую платформу для пакетной обработки данных, потоковой обработки в режиме реального времени и интерактивных запросов.

  • Поддержка SQL. Позволяет использовать ANSI SQL для работы с датасетами.

  • Поддержка нескольких языков программирования. Spark предоставляет API для популярных языков, таких как Java, Scala, Python и R.

  • Встроенные инструменты машинного обучения. Библиотека MLlib предоставляет широкий набор инструментов для машинного обучения над большими распределенными датасетами.

Компоненты

Ниже приведена высокоуровневая архитектурная схема Spark.

Архитектура Spark
Архитектура Spark
Архитектура Spark
Архитектура 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-кластере.

  1. Драйвер Spark создает объект SparkContext. В зависимости от режима деплоя Spark-драйвер запускается:

    • или внутри процесса Application Master, который управляется YARN (режим кластера);

    • или как отдельный клиентский процесс, а Application Master используется только для запроса ресурсов у YARN (режим клиента).

  2. SparkContext обращается к YARN для создания исполнителей. YARN запускает контейнеры для Spark-исполнителей на узлах кластера с компонентами YARN NodeManager.

  3. Каждый исполнитель регистрируется на стороне драйвера, уведомляя о своей готовности к выполнению задач.

  4. При выполнении трансформации (transformation) Spark создает или модифицирует логический план в виде DAG. Поскольку Spark-трансформации являются "ленивыми", на этом этапе фактическая работа кластером не выполняется. Пример трансформации:

    val filtered_students = df.filter($"age" > 18)
  5. Для выполнения действия (action) Spark инициирует вычисления согласно DAG-плану. Пример операции типа action:

    filtered_students.count()
  6. Драйвер оптимизирует логический план, а затем преобразует его в физический план. На этом этапе выполняются оптимизации, например pushdown.

  7. DAG Scheduler разбивает задачи (job) на этапы (stage).

  8. Драйвер генерирует задания (task) и планирует их выполнение. Отдельные задания сериализуются и направляются исполнителям через TaskScheduler. Исполнители выбираются на основе локальности данных, доступных ресурсов и так далее.

  9. Исполнители выполняют полученные задания. Каждый исполнитель считывает входные блоки данных, выполняет логику трансформаций для отдельной партиции и при необходимости записывает shuffle-файлы. Статус выполнения отправляется обратно драйверу.

  10. Драйвер собирает результаты от исполнителей, и работа приложения 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 позволяет генерировать машиночитаемые логи для автоматической обработки. Обеспечивает лучшую интеграцию с современными системами агрегации логов.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней