Краткое содержание статьи
В области больших данных важность SQL очевидна, и это можно даже назвать «все можно SQLизировать».
Независимо от того, создаете ли вы платформу или приложение, вам неизбежно придется иметь дело с SQL. Фраза «SQL Boy», хотя и является самоуничижением, также может иллюстрировать тесную связь между инженерами по работе с большими данными и SQL.
От самых примитивных и популярных механизмов запросов SQL, таких как Hive/Spark SQL, до механизмов OLAP, таких как Kylin/ClickHouse, до потоковой передачи Flink SQL/Kafka SQL, различные стеки технологий обработки больших данных более или менее развиты.
Можно сказать, что отсутствие поддержки SQL ухудшит собственную техническую архитектуру, а также повлияет на удобство использования.
Среди всех этих движков Spark SQL имеет самую глубокую и лучшую оптимизацию SQL!
1
Что такое Spark SQL?
Spark SQL — это модуль в Spark, используемый для обработки структурированных данных. Он предоставляет абстракцию программирования (DataFrame) и может использоваться в качестве механизма запросов для распределенного SQL.
Spark SQL может преобразовывать задачи вычисления данных в RDD в форме SQL, а затем отправлять их в кластер для вычислений. Подобно Hive, который преобразует задачи вычисления данных в MapReduce в форме SQL, он значительно упрощает запись данных Spark. программы расчетных операций, а эффективность его выполнения выше, чем у вычислительной модели MapReduce.
В Spark Spark SQL — это не просто узкий SQL, а основной компонент оптимизации и выполнения программ Spark.
Потоковые вычисления, машинное обучение, графовые вычисления, глубокое обучение и другие приложения можно преобразовать в API DataFrame/Dataset. Эти API, как и обычный SQL, имеют общий уровень оптимизации, уровень выполнения и возможность доступа к нескольким источникам данных.
Можно сказать, что Spark SQL — это «закулисный герой», который делает приложения Spark эффективными, высокоотказоустойчивыми и экологически чистыми.
2
Возможности Spark SQL
Spark SQL имеет следующие возможности:
3
Как работает Spark SQL
Прежде чем понять принцип работы Spark SQL, нам необходимо сначала понять архитектуру Spark SQL:
3.1
Архитектура Spark SQL
Spark SQL состоит из 4 частей: Core, Catalyst, Hive и Hive-Thriftserver.
Архитектура Spark SQL
Spark SQL Core: компилятор запросов Catalyst
Ядром Spark SQL является компилятор запросов Catalyst, который преобразует SQL/DataFrame/Dataset в пользовательской программе посредством серии операций в RDD, выполняемые в системе Spark.
Компонент компилятора запросов Catalyst
Катализатор состоит из следующих важных компонентов:
1. Parser
Преобразование SQL/DataFrame/Dataset в неразрешенное дерево в Spark называется логическим планом, который представляет собой абстракцию пользовательской программы.
Совместим со стандартом ANSI SQL 2003 и HiveQL.
2. Analyzer
Используйте информацию в каталоге для анализа дерева, созданного в Parser.
Анализатор состоит из серии правил (Rule), каждое правило отвечает за определенную операцию проверки или преобразования, например, за анализ имен таблиц и имен столбцов в SQL и определение их существования.
Через Анализатор мы можем получить анализируемый логический план.
3. Optimizer
Оптимизируйте древовидную структуру разобранного логического плана для повышения эффективности выполнения.
Процесс оптимизации также завершается с помощью ряда правил. Часто используемые правила включают в себя перемещение предикатов, сокращение столбцов, изменение порядка соединений и т. д.
Кроме того, в Spark SQL имеется оптимизатор на основе затрат, который является важным компонентом, разработанным внутри DLI и предоставленным сообществом открытого исходного кода. Оптимизатор может автоматически генерировать оптимальный план на основе распределения данных.
4. Planner
Преобразуйте оптимизированный логический план в план физического выполнения (Физический план).
Он состоит из серии стратегий. Каждая стратегия преобразует определенный логический оператор в соответствующий оператор физического выполнения и, в конечном итоге, становится конкретной операцией RDD.
Обратите внимание, что в процессе преобразования один логический оператор может соответствовать реализации нескольких физических операторов. Например, соединение может быть реализовано как SortMergeJoin или BroadcastHashJoin. В этом случае необходимо выбрать лучший оператор на основе модели стоимости.
Упомянутый выше оптимизатор затрат также может сыграть ключевую роль в этом процессе выбора.
Вся платформа Catalyst обладает хорошей масштабируемостью. Разработчики могут гибко добавлять свою собственную грамматику, правила синтаксического анализа, правила оптимизации и стратегии преобразования в соответствии с различными потребностями.
3.2
Основные принципы работы SQL
Понять В традиционной реляционной базе данныхиз Основные принципы работы SQL, полезно, правда Как работает Spark SQL лучше понимается.
Базовый процесс выполнения SQL
В традиционных реляционных базах данных самый простой оператор запроса SQL состоит из трех частей: проекция (a1, a2, a3), источник данных (таблица A) и фильтр (условие).
переписывались соответственно SQL Во время запроса Result、DataSource и Операция, то есть согласно Result --> DataSource --> Operation описано по порядку.
но SQL Фактический процесс исполнения основан на Operation --> DataSource --> Result выполняются в порядке, соответствующем SQL Синтаксис прямо противоположный.
Конкретный процесс выполнения выглядит следующим образом:
3.3
Выполняемый процесс Spark SQL
Spark SQL использует метод, аналогичный реляционным базам данных, для обработки операторов SQL и соответствует структуре композиции Catalyst.
Выполняемый процесс Spark SQL
Ниже для иллюстрации используются примеры SQL и графические средства:
3.3.1. Используйте SessionCatalog для сохранения метаданных.
SQLContext необходимо инициализировать перед анализом операторов SQL, который определяет контекст SQL Spark, а SessionCatalog загружается перед вводом операторов SQL.
При инициализации SQLContext метаданные будут сохранены в SessionCatalog, включая имя базы данных, имя таблицы, имя поля, тип поля и т. д. Эти данные будут использоваться при разрешении несвязанных логических планов.
3.3.2 Генерация несвязанных логических планов с помощью Antlr.
Spark2.0 Начните использовать Antlr Провести морфологический и грамматический анализ, Antlr Будет построено синтаксическое дерево, сгенерированное на основе ключевых слов, которое представляет собой несвязанный логический план выполнения (неразрешенные Logical план), в том числе Unresolved Relation、Unresolved Function и Unresolved Attribute。
▲ Анализировать SQL и генерировать абстрактное синтаксическое дерево (несвязанный логический план выполнения)
3.3.3 Используйте Анализатор для привязки логического плана.
На этом этапе анализатор использует правила анализа в сочетании с метаданными SessionCatalog для анализа несвязанного логического плана и создания связанного логического плана (анализируемого логического плана).
Конкретный процесс:
Создайте экземпляр простого анализатора, затем просмотрите предопределенный пакет и запустите правила в пакете с помощью метода выполнения родительского класса Rule Executor. Каждое правило будет обрабатывать несвязанный логический план.
Некоторые из них можно обработать за один синтаксический анализ, а некоторые требуют нескольких итераций. Итерация не остановится, пока не достигнет времени фиксированной точки или не произойдет никаких изменений в древовидной структуре до и после этих двух раз.
▲ Добавьте метаданные в синтаксическое дерево и создайте логический план привязки.
3.3.4. Используйте Оптимизатор для оптимизации логических планов.
Optimizer методы реализации и обработки следуют Analyzer Аналогично определите ряд Optimization Правила, используйте их Rules Воля связывает логический план для итеративной обработки, завершает работу по слиянию, сокращению столбцов и оптимизации ожидания предикатов и генерирует оптимизированный логический план (Оптимизированный Logical Plan)。
▲ Predicate Pushdown (предикатное нажатие вниз), Фильтр перемещается в положение сканирования, а данные, соответствующие условиям, отфильтровываются перед выполнением операции соединения, чтобы уменьшить объем данных в операции.
▲ Column Pruning (очистка столбцов) сохраняет только те столбцы, которые используются в запросе, и удаляет другие столбцы, чтобы уменьшить объем обрабатываемых данных и повысить скорость.
3.3.5 Используйте SparkPlanner для создания физических планов для исполняемых планов.
SparkPlanner использует стратегии планирования для преобразования оптимизированного логического плана и создания исполняемого физического плана (физического плана).
На основе прошлой статистики производительности выберите лучшую модель затрат плана физического выполнения и, наконец, создайте исполняемое дерево плана физического выполнения, чтобы получить SparkPlan.
▲ Используйте метод queryExecution для просмотра логического плана выполнения.
▲ Используйте метод объяснения для просмотра плана физического выполнения.
3.3.6. Используйте выполнение для выполнения физического плана.
Прежде чем, наконец, фактическое выполнение плана физического выполнения, еще предстоит Preparations Обработка правил, наконец, называется SparkPlan из execute()
,Выполнить физический планрасчет RDD。
▲ Выполнить физический план и вернуть данные результата.
После описанного выше процесса процесс записи пользователя завершается. SQL заявление (или DataFrame/Dataset), приезжать Spark внутренний RDD Конкретная логика работы трансформации.
Позже будет новая глава, в которой будет показано, как практиковать Spark SQL, так что следите за обновлениями!
4
Абстракция данных Spark SQL
существовать Spark SQL В DataFrame есть две абстракции данных: и DataSet。
4.1
DataFrame
существовать Spark середина,DataFrame это своего рода RDD — базовый распределенный набор данных.,Аналогично традиционной базе данныхиздвумерныйповерхностьсетка。
DataFrame и RDD Основное различие между изсуществовать состоит в том, что первое имеет Schema Метаинформация, т.е. DataFrame. Представленный набор данных двумерной таблицы в каждом столбце имеет имя и тип информации о структуре данных. В то же время и Hive Аналогично, DataFrame Вложенные типы данных (Struct, Array и Map)。
Это делает Spark SQL Получите больше информации о структурной информации, которая скрыта в DataFrame За кулисами из Источник данных также действует на DataFrame вышеиз Трансформация осуществляетсяпротивсексизоптимизация,Наконец, цель значительного повышения эффективности времени выполнения достигнута.
С другой стороны RDD,Зависит Не зная конкретной структуры хранимых элементов данных, Spark Core может толькосуществовать Stage Слои просты в выполнении、Универсальныйизсборочная линияоптимизация。
Кроме того, из API С точки зрения простоты использования DataFrame API Предоставляет набор реляционных операций высокого уровня, которые лучше функциональных. RDD API Будьте более дружелюбны и устанавливайте более низкие барьеры для входа.
DataFrame имеет следующие характеристики:
4.2
DataSet
DataFrame имеет следующие ограничения:
На основании двух вышеуказанных пунктов, от Spark 1.6 начать появляться Набор данных, как DataFrame API Расширение — строго типизированный объект из конкретного домена, который может быть преобразован параллельно с функциональными или реляционными операциями в сочетании с RDD и DataFrame из Преимуществ, чтобы Spark 2.0 генерал-лейтенант DataFrame и DataSet слиться.
каждый DataSet Еще есть один под названием DataFrame из Типизированный вид, такой DataFrame да Row Тип из DataSet, то есть Набор данных[строка]. Следовательно, DataFrame Может рассматриваться как особый тип из DataSet типа Row。
RDD, DataFrame, DataSet из отношений
DataSet API да DataFrames из Расширять,Он обеспечивает типобезопасный объектно-ориентированный интерфейс программирования.,Это строго типизированная неизменяемая коллекция объектов.,Сопоставляется с реляционной схемой.
Преимущества DataSet:
4.3
Различия между RDD, DataFrame и DataSet
4.3.1. структурноизразличия
RDD、DataFrame、DataSet существоватьструктурноизразличия
4.3.2. данныеизразличия
Предположим, что в RDD[Person] есть две строки данных:
Данные в но DataFrame:
DataFrame = RDD[Person] - Дженерики + Schema + SQL + оптимизация
Данные в Dataset[Person]:
Dataset[Person] = DataFrame + Дженерики = RDD[Person] + Schema + SQL + оптимизация
Данные в Dataset[Row]:
DataFrame = DataSet[Row]
Это можно увидеть более интуитивно по данным. RDD、DataFrame、DataSet междуизразличия。
5
SparkSession
Spark 2.0 введено в SparkSession, который предоставляет пользователям единую точку входа для изучения ииспользования. Spark из различных функций и позволяет пользователям вызывать его DataFrame и DataSet изолированный API писать Spark программа.
Самое главное,Это снижает потребность пользователей в понимании некоторых концепций.,Облегчает нам общение и Spark.
SparkSession можно использовать непосредственно в Spark Shell.
существовать Spark Первые днииз Версия Средний, ИскраContext да Spark от главной точки входа, Зависит от В RDD даосновнойиз API,и Spark Должен быть создан до взаимодействия SparkConf и SparkContext, через SparkContext создавать и эксплуатировать RDD。
верно Вдругойиз API,нуждатьсяиспользоватьдругойиз Контекст. Например, для Потоковая передача, нужно использовать Стриминг Контекст; SQL, нужно использовать SQLКонтекст; для Улей, нужно использовать HiveContext。
носледовать DataSet и DataFrame из API Постепенно становится стандартом API, для них необходимо установить точки доступа.
таксуществовать Spark2.0, представил SparkSession как DataSet и DataFrame API из Точка входа, SparkSession Инкапсулированный SparkConf и Искра Контекст. Для обратной совместимости SQLContext и HiveContext Также сохранено, заключено в капсулу существующее SparkSession середина.
Поэтому при использовании SparkSession нет необходимости явно создавать SparkConf, SparkContext и SQLContext.
SparkSession По сути да SQLContext и HiveContext из комбинации (могут быть добавлены в будущем StreamingContext),таксуществовать SQLContext и HiveContext Доступно на API существовать SparkSession На том же да можно использоватьиз.
SparkSession внутренний Инкапсулированный SparkContext, поэтому расчет на самом деле да Зависит от SparkContext Завершенный.
Информация об авторских правах: © Олаф Протце / Alamy Stock Photo