Открыть сервис

Spark SQL

Spark SQL — это модуль для обработки структурированных и полуструктурированных данных в рамках вычислительной платформы Apache Spark, предоставляющий интерфейс для работы с данными через язык запросов SQL и программные API на языках Java, Scala, Python и R. Модуль позволяет выполнять запросы, аналогичные SQL, над распределёнными наборами данных, поддерживая интеграцию с различными источниками данных (Hive, Avro, Parquet, JSON, JDBC) и обеспечивая высокую производительность за счёт использования оптимизатора Catalyst и механизма выполнения Tungsten.

История

Spark SQL был официально представлен в составе Apache Spark 1.0 (выпуск 2014 года) как замена более раннему модулю Shark, который базировался на Apache Hive и имел ограничения по производительности и совместимости. Основная цель создания Spark SQL — предоставить единый механизм для работы как с реляционными данными (SQL), так и с алгоритмическими вычислениями (например, MapReduce-подобными операциями) в рамках одного процесса. Разработка велась под руководством лаборатории AMPLab Калифорнийского университета в Беркли и позднее — компанией Databricks.

В версии Spark 2.0 (2016 год) Spark SQL стал центральным компонентом всей платформы: API DataFrame и Dataset, построенные поверх Spark SQL, вытеснили устаревшие RDD (Resilient Distributed Datasets) для большинства задач, требующих структурированных данных. В последующих версиях (Spark 3.x) модуль получил поддержку ANSI SQL, улучшенную обработку потоковых данных через Structured Streaming и интеграцию с хранилищами данных в облаке.

Классификация и компоненты

Spark SQL можно условно разделить на три основные логические части:

Устройство и архитектура

Spark SQL обрабатывает запросы в несколько стадий:

  1. SQL-парсинг — текст SQL-запроса разбирается в абстрактное синтаксическое дерево (AST), которое представляет логический план запроса.
  2. Анализ — AST проверяется на семантическую корректность: разрешаются имена таблиц и столбцов, проверяются типы данных, присоединяются метаданные из каталога (Hive Metastore или встроенного SparkSessionCatalog).
  3. Логическая оптимизация — Catalyst применяет фиксированный набор правил: перестановка предикатов (predicate pushdown), проталкивание проекций (project pruning), упрощение выражений, удаление подзапросов (subquery unnesting) и другие. Результат — оптимизированный логический план.
  4. Физическое планирование — из оптимизированного логического плана выбирается конкретный набор физических операторов (например, выбор метода соединения — SortMergeJoin, BroadcastHashJoin, ShuffledHashJoin), учитывающий статистики данных и окружение (размер данных, наличие бродкаста).
  5. Генерация кода — Tungsten преобразуёт физический план в эффективный скомпилированный Java-байт-код, минимизируя вызовы виртуальных функций и упаковку объектов. Это позволяет выполнять до нескольких миллиардов строк в секунду на одном ядре (в синтетических тестах).
  6. Выполнение — сгенерированный код выполняется на узлах кластера Spark с минимальным использованием Java-объектов (вся обработка ведётся в off-heap памяти или в массивах примитивных типов).

Применение

Spark SQL используется в трёх основных сценариях:

Примеры

Преимущества и недостатки

Spark SQL обеспечивает:

Недостатки:

Критика

Основные замечания сообщества касаются избыточной сложности настройки и отладки: оптимизация запросов нередко требует понимания внутреннего устройства Catalyst и Tungsten. Например, неверный выбор бродкаста больших таблиц может приводить к переполнению памяти на драйвере. Некоторые пользователи также указывают на то, что Spark SQL сохраняет ряд ограничений по сравнению с традиционными реляционными СУБД (например, ограниченная поддержка хранимых процедур). В ответ на это разработчики Databricks и сообщества активно внедряют новые возможности в каждом релизе, приближая Spark SQL к полному соответствию SQL-стандарту.

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →