Правила оптимизации в Spark SQL и их улучшения в Radiant

Автор Категория ,
Правила оптимизации в Spark SQL и их улучшения в Radiant

В этой статье для разработчиков Spark-приложений и дата-аналитиков рассмотрим новый оптимизатор этого фреймворка, Radiant. Он основан на SQL-оптимизаторе Catalyst и представляет собой open-source проект от энтузиастов сообщества Apache Spark. Читайте далее, чем хорош Spark-Radiant и как использовать его для оптимизации SQL-запросов при аналитике больших данных.

Что такое SQL-оптимизатор Spark-Radiant и чем он лучше Catalyst

Оптимизатор Spark-Radiant основан на сборке Maven и поддерживает версию фреймворка от 3.0 и выше, а также версию Scala от 2.12. Проект состоит из 2-х модулей:

  • spark-radiant-sql, который содержит оптимизацию, связанную с производительностью Spark SQL. В частности, он отлично подходит для динамической фильтрации, например, при соединении таблиц в звездообразных схемах, когда одна таблица состоит из большого количества записей по сравнению с другими таблицами. Динамическая фильтрация работает во время выполнения, используя предикаты из меньшей таблицы, отфильтровывая столбцы соединения, используя результат этих предикатов для большей таблицы и отфильтровывая большую таблицу. Это приводит к менее затратному соединению. Поскольку количество записей в левой части уменьшается, что приводит к повышению производительности запросов Spark SQL за счет уменьшения объема данных, передаваемых по сети и минимизации сетевого ввода-вывода.
  • spark-radiant-core содержит оптимизатор на основе затрат (total cost optimization), а также улучшенное автомасштабирование в Spark и сборщик метрик.

Тестирование показало, что динамическая фильтрация с оптимизатором Spark-Radiant работает быстрее регулярного JOIN-соединения. Это достигается за счет улучшения Catalyst-оптимизатора, включая индексацию BloomFilter и переупорядочивание соединений. Напомним, в Catalyst-оптимизаторе фреймворка имеется CostBasedJoinReorder – базовая логическая оптимизация, которая переупорядочивает соединения с целью сокращения затрат. ReorderJoin является частью пакета Join Reorder в стандартных пакетах Catalyst Optimizer. ReorderJoin – это просто правило Catalyst для преобразования логических планов, то есть правило логического плана выполнения SQL-запроса. В SQL-оптимизаторе правило – это именованное преобразование, которое может быть применено (выполнено или преобразовано) к дереву узлов логического плана (TreeNode) для создания нового TreeNode. CostBasedJoinReorder применяет оптимизацию соединения к логическому плану с 2 или более последовательными внутренними или перекрестными соединениями, когда оба свойства конфигурации spark.sql.cbo.enabled и spark.sql.cbo.joinReorder.enabled включены. Подробнее о работе оптимизатора Catalyst мы писали здесь, здесь и здесь.

Core Spark - основы для разработчиков

Код курса
CORS
Ближайшая дата курса
20 января, 2022
Длительность обучения
16 ак.часов
Стоимость обучения
36 000 руб.

В оптимизаторе Spark-Radiant-Sql правила логического плана доступны во время выполнения на языках Scala и PySpark. Например, код на Scala выглядит так:

import com.spark.radiant.sql.api.SparkRadiantSqlApi

// adding Extra optimizer rule

val sparkRadiantSqlApi = new SparkRadiantSqlApi()

sparkRadiantSqlApi.addOptimizerRule(spark)

А на PySpark так:

./bin/pyspark –packages io.github.saurabhchawla100:spark-radiant-1.0.2

// Importing the extra Optimizations rule from sparkradiantsqlpy

import SparkRadiantSqlApi

SparkRadiantSqlApi(spark).addExtraOptimizerRule()

OR
   // Importing the extra Optimizations rule

spark._jvm.com.spark.radiant.sql.api.SparkRadiantSqlApi().addOptimizerRule(spark._jsparkSession)

Одним из интересных правил в Spark-Radiant является UnionReuseExchangeOptimizeRule, которое работает для сценариев соединения таблиц с агрегацией, имеющей те же столбцы группировки. Соединение происходит между одной и той же таблицей (источником данных). При этом вместо двойного сканирования исходной таблицы будет одно сканирование, которое будет использовать другой дочерний элемент узла – элемент SQL-запроса Union. Эта функция включается с помощью установки конфигурации spark.sql.optimize.union.reuse.exchange.rule в значение true.

Еще одним улучшающим правилом в Spark-Radiant является ExchangeOptimizeRule, которое работает для сценариев частичного агрегированного обмена и обмена данными в случайном порядке. Если стоимость создания обоих обменов почти одинакова, то обмен, созданный частичным агрегатом, пропускается. Это правило включается с помощью настройки фонфигурации spark.sql.skip.partial.exchange.rule.

Попробовать эти и другие возможности нового оптимизатора Spark SQL можно, установив его JAR-пакет в проект Maven:

./bin/spark-shell

–packages “io.github.saurabhchawla100:spark-radiant-sql:1.0.2,io.github.saurabhchawla100:spark-radiant-core:1.0.2”

./bin/spark-submit

–packages “io.github.saurabhchawla100:spark-radiant-sql:1.0.2,io.github.saurabhchawla100:spark-radiant-core:1.0.2”

–class com.test.spark.examples.SparkTestDF /spark/examples/target/scala-2.12/jars/spark-test_2.12-3.1.1.jar

Анализ данных с Apache Spark

Код курса
SPARK
Ближайшая дата курса
17 января, 2022
Длительность обучения
24 ак.часов
Стоимость обучения
54 000 руб.

Узнайте больше подробностей эксплуатации Apache Spark для разработки распределенных приложений и аналитики больших данных вам помогут узнать специализированные курсы в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://saurabhchawla100.medium.com/spark-radiant-is-now-available-13914e35a61f
  2. https://github.com/SaurabhChawla100/spark-radiant
  3. https://saurabhchawla100.medium.com/spark-radiant-apache-spark-performance-and-cost-optimizer-a55f719c77d4