Руководство по обновлению Spark 3 в кластерах больших данных SQL Server

Область применения: SQL Server 2019 (15.x)

Важно!

Поддержка надстройки "Кластеры больших данных" Microsoft SQL Server 2019 будет прекращена. Мы прекратим поддержку Кластеров больших данных SQL Server 2019 28 февраля 2025 г. Все существующие пользователи SQL Server 2019 с Software Assurance будут полностью поддерживаться на платформе, а программное обеспечение будет продолжать поддерживаться через SQL Server накопительных обновлений до этого времени. Дополнительные сведения см. в записи блога объявлений и в статье о параметрах больших данных на платформе Microsoft SQL Server.

Эта статья содержит важную информацию и рекомендации по переносу рабочих нагрузок Apache Spark 2.4 в Spark версии 3.1. Это необходимо для обновления Кластеры больших данных SQL Server с версии CU12 на версию CU13 и на более поздние версии.

Общие сведения об Apache Spark 3 в Кластеры больших данных SQL Server

До накопительного обновления 12 (CU12) в кластерах больших данных применялась линейка продуктов Apache Spark 2.4, которая прекратила использоваться в мае 2021 г. В соответствии с нашими обязательствами по постоянному улучшению возможностей машинного обучения и больших данных, предоставляемых подсистемой Apache Spark, в версии CU13 начинает использоваться текущий выпуск Apache Spark, версия 3.1.2.

Новый уровень производительности

В этой новой версии Apache Spark улучшена производительность рабочих нагрузок для обработки больших данных. Используя эталонную рабочую нагрузку TCP-DS 10TB в своих тестах, мы смогли сократить время выполнения с 4,19 ч до 2,96 ч (улучшение на 29,36 % ) только за счет смены подсистемы, с использованием того же оборудования и профиля конфигурации в Кластеры больших данных SQL Server, без дополнительной оптимизации приложений. Среднее время выполнения отдельных запросов было улучшено на 36 %.

Открытие меню отправки посредством щелчка на панели мониторинга

Руководство по обновлению

Spark 3 — это основной выпуск, содержащий критические изменения. Следуя тем же рекомендациям, что и для семейства SQL Server, выполните следующие действия.

  1. Полностью прочтите эту статью.
  2. Ознакомьтесь с официальным Руководством по миграции Apache Spark 3.
  3. Параллельно разверните новую версию кластера больших данных CU13 в текущей среде.
  4. (Необязательно.) Воспользуйтесь новой функцией распределенного копирования HDFS с помощью команды azdata, чтобы подготовить подмножество данных для проверки.
  5. Перед обновлением проверьте текущую рабочую нагрузку в Spark 3.
  6. Повторно оцените принудительную оптимизацию Spark в соответствии со стратегиями определения кода и таблицы. Spark 3 предоставляет новые возможности по случайной выборке, секционированию. В этой версии также улучшены возможности адаптивного выполнения запросов. Это отличная возможность повторно оценить предыдущие решения и попробовать только что выпущенные функции подсистемы.

Что происходит при обновлении кластера?

В процессе обновления кластера будет развернута новая версия объектов pod Spark и будет обновлена среда выполнения для Apache Spark. После обновления компоненты Spark 2.4 больше не будут использоваться.

Постоянные изменения конфигурации, внесенные на платформе настройки, будут сохранены.

Пользовательские библиотеки и артефакты, непосредственно загруженные в HDFS, будут сохранены. При этом необходимо убедиться, что эти библиотеки и артефакты совместимы с Spark 3.

Предупреждение

Изменения, внесенные непосредственно в объекты pod, будут утеряны. Проверьте и повторно примените эти изменения, если они актуальны для Spark 3.

Критические изменения

Версия Spark 3 не обладает полной обратной совместимостью с версией 2.4, критические изменения вызваны преимущественно тремя факторами.

  • Версия Scala 2.12, используемая Spark 3, не совместима с версией Scala 2.11, используемой Spark 2.4
  • Изменения и устаревшие функции API Spark 3
  • Обновления библиотек для среды выполнения кластеров больших данных SQL Server для Apache Spark

Версия Scala 2.12, используемая Spark 3, не совместима с версией Scala 2.11

Если для выполнения заданий Spark требуются JAR-файлы Scala 2.11, необходимо выполнить повторную сборку этих заданий с использованием Scala 2.12. Версии Scala 2.11 и 2.12 по большей части совместимы на уровне исходного кода, но несовместимы на уровне двоичных файлов. Дополнительные сведения см. в разделе Scala 2.12.0.

Необходимо выполнить следующие изменения.

  1. Измените версию Scala для всех зависимостей Scala.
  2. Измените версию Spark для всех зависимостей Spark.
  3. Измените все зависимости Spark с указанной областью за исключением внешних зависимостей, таких как spark-sql-kafka-0-10.

Ниже приведен пример файла pom.xml:

  <properties>
    <spark.version>3.1.2</spark.version>
    <scala.version.major>2.12</scala.version.major>
    <scala.version.minor>10</scala.version.minor>
    <scala.version>${scala.version.major}.${scala.version.minor}</scala.version>
  </properties>
 
  <dependencies>
 
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
     <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql-kafka-0-10_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
    </dependency>
    
  </dependencies>

Изменения и устаревшие функции API Spark 3

Ознакомьтесь с официальным руководством по миграции Apache Spark 3, в котором подробно рассматриваются все изменения API.

Некоторые изменения описаны ниже.

Критическое изменение Действие
Параметры yarn-client и yarn-clustermodesspark-submit удалены в Spark 3 Вместо него следует использовать элементы spark-submit --master yarn --deploy-mode client или --deploy-mode cluster.
Подробные сведения см. на странице https://spark.apache.org/docs/latest/running-on-yarn.html
Класс HiveContext удален Вместо нее следует использовать SparkSession.builder.enableHiveSupport().
Порядок аргументов в методе TRIM изменен на обратный Используйте TRIM(str, trimStr) вместо TRIM(trimStr, str)
Из-за обновления до Scala 2.12 метод DataStreamWriter.foreachBatch не совместим с программой Scala на уровне исходного кода Обновите исходный код Scala, чтобы функция Scala и лямбда-выражение Java различались.

Обновления библиотек для среды выполнения кластеров больших данных SQL Server для Apache Spark

Как описано в спецификации среды выполнения кластеров больших данных SQL Server для Apache Spark, в выпуске CU13 были обновлены все библиотеки Python, R и Scala. Также были добавлены многие библиотеки для улучшения работы.

  1. Убедитесь, что ваша рабочая нагрузка поддерживает новый набор библиотек.
  2. Проверьте, входит ли загруженная пользовательская библиотека в пакеты по умолчанию, и настройте спецификации заданий, так чтобы исключить пользовательскую библиотеку и разрешить заданию использовать имеющуюся библиотеку.

Вопросы и ответы

Как устранить странную ошибку с исключениями java.lang.NoSuchMethodError или java.lang.ClassNotFoundException

Скорее всего, эта ошибка вызвана конфликтом версий Spark или Scala. Внимательно проверьте указанное ниже и выполните повторную сборку проекта.

  1. Убедитесь, что все версии Scala обновлены.
  2. Убедитесь, что все зависимости Spark обновлены с указанием правильных версий Scala и Spark.
  3. Убедитесь, что для всех зависимостей Spark за исключением spark-sql-kafka-0-10 указана область.

Исключение SparkUpgradeException из-за изменения режима календаря

В модели календаря в Spark 3.0 есть изменения. При записи столбца календаря в Spark SQL может появиться следующее исключение.

Caused by: org.apache.spark.SparkUpgradeException: 
You may get a different result due to the upgrading of Spark 3.0:
writing dates before 1582-10-15 or timestamps before 1900-01-01T00:00:00Z into Parquet INT96 files can be dangerous,
as the files may be read by Spark 2.x or legacy versions of Hive later, 
which uses a legacy hybrid calendar that is different from Spark 3.0+'s Proleptic Gregorian calendar. 
See more details in SPARK-31404.
You can set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'LEGACY' to 
rebase the datetime values w.r.t. the calendar difference during writing, to get maximum interoperability. 
Or set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'CORRECTED' to 
write the datetime values as it is, if you are 100% sure that the written files 
will only be read by Spark 3.0+ or other systems that use Proleptic Gregorian calendar.

Решение: задайте для параметра spark.sql.legacy.parquet.int96RebaseModeInWrite значение "LEGACY" или "CORRECTED", как описано выше. Ниже приведено возможное решение в виде кода PySpark:

spark.conf.set("spark.sql.legacy.parquet.int96RebaseModeInWrite","CORRECTED")

Дальнейшие действия

Дополнительные сведения см. в разделе Общие сведения о Кластеры больших данных SQL Server.