Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Databricks настоятельно рекомендует декларативные пакеты автоматизации вместо создания и развертывания JAR вручную, как описано на этой странице. Декларативные пакеты автоматизации упрощают создание проекта из шаблона с правильными версиями Scala, JDK и Databricks Connect, которые уже настроены для бессерверных версий, а также обеспечивает простое развертывание JAR-файла в рабочей области Databricks. См. статью о сборке JAR-файла Scala с декларативными пакетами автоматизации.
Это важно
Бессерверные задания Scala и Java находятся в общедоступной предварительной версии.
Архив Java (JAR) упаковывает код Java или Scala в один файл. Создайте JAR-файл с кодом Spark и разверните его в качестве задачи JAR на бессерверных вычислениях в задании Lakeflow.
Требования
Чтобы создать JAR-файл, локальная среда разработки должна иметь следующую установку:
- sbt 1.11.7 или более поздняя версия для JAR-файлов Scala
- Maven 3.9.0 или более поздней версии для Java JAR
- версии JDK, Scala и Databricks Connect, соответствующие бессерверной среде. См. сведения о версиях зависимостей.
Версии зависимостей
Это важно
Чтобы выполняться на бессерверных вычислениях без сбоев, версии JAR Scala и JDK должны точно соответствовать версиям Scala и JDK среды выполнения. См. сведения о версиях Databricks Connect.
В примере на этой странице используется бессерверная среда версии 4, поэтому эта страница создает JAR-файл, который:
- Компилируется в Scala 2.13; каждая зависимость использует
_2.13суффикс. - Скомпилирован с использованием JDK 17, версия файла класса — 61.
- Скомпилировано с использованием Databricks Connect 17.3 — набора API Spark для бессерверных вычислительных ресурсов.
- Использует только общедоступные API Spark. В нем не используются RDD и внутренние компоненты Spark. См. Ограничения.
- Включает все зависимости в JAR-файл или подключает их как библиотеку бессерверной среды. См. статью "Управление зависимостями".
Ограничения
Бессерверные вычисления используют Spark Connect. JAR-файл выполняется в тонкой клиентской библиотеке, которая предоставляет общедоступные API Spark, в то время как ядро Spark работает на стороне сервера. Код, который обходит публичный API, не может использовать преимущества оптимизации Catalyst или ускорения Photon, даже на классических вычислительных ресурсах. Код на основе RDD и код, зависящий от внутренних механизмов, как правило, работает медленнее, чем эквивалентный код DataFrame или SQL.
Следующие возможности недоступны:
- API RDD (
org.apache.spark.rdd.*) иSparkContext/JavaSparkContext. ИспользуйтеSparkSession.builder().getOrCreate()и операции DataFrame/Dataset вместо этого. - Внутренние API Spark (
org.apache.spark.catalyst.*,org.apache.spark.util.*,org.apache.spark.sql.util.*,org.apache.spark.sql.internal.*). Код, импортирующий эти API, завершается с ошибкойNoClassDefFoundError. Перевести на публичный API Spark. Если в сторонней библиотеке используются внутренние компоненты, проверьте, публикует ли он выпуск, совместимый с Spark Connect. - Нативные библиотеки (
.so,.dll, JNI). Бессерверные вычисления не позволяют записывать собственные библиотеки в файловую систему. Библиотеки, которые распаковывают нативные двоичные файлы при запуске, завершаются с ошибкойUnsatisfiedLinkError. Скрипты инициализации не являются обходным решением. Используйте эквивалент Java, если он доступен.
Если для рабочей нагрузки требуется любой из указанных выше вариантов, запустите ее на стандартном или выделенном вычислительных ресурсах .
Шаг 1. Создание JAR-файла
Scala
Выполните следующую команду, чтобы создать проект Scala:
sbt new scala/scala-seed.g8При появлении запроса введите имя проекта, например
my-spark-app.Затем удалите файлы-заглушки seed-проекта и создайте каталог для исходного кода:
cd my-spark-app rm src/main/scala/example/Hello.scala rm src/test/scala/example/HelloSpec.scala rm project/Dependencies.scala mkdir -p src/main/scala/com/examplesЗамените содержимое файла
build.sbtследующим образом:name := "my-spark-app" // Set the dependency versions scalaVersion := "2.13.16" javacOptions ++= Seq("--release", "17") scalacOptions ++= Seq("-release", "17") libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.2" % "provided" // Your other dependencies go here. Use %% for Scala libraries so sbt picks the _2.13 artifact. // Fork a new JVM on run so our javaOptions are applied. fork := true javaOptions += "--add-opens=java.base/java.nio=ALL-UNNAMED"Измените или создайте файл
project/plugins.sbtи добавьте эту строку:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1")Создайте ваш основной класс в
src/main/scala/com/examples/SparkJar.scala:package com.examples import org.apache.spark.sql.SparkSession object SparkJar { def main(args: Array[String]): Unit = { val spark = SparkSession.builder().getOrCreate() // Prints the arguments to the class, which // are job parameters when run as a job: println(args.mkString(", ")) // Shows using spark: println(spark.version) println(spark.range(10).limit(3).collect().mkString(" ")) } }Чтобы создать JAR-файл, выполните следующую команду:
sbt assemblyСкомпилированный JAR-файл создается в папке
target/какmy-spark-app-assembly-0.1.0-SNAPSHOT.jar.
Ява
Выполните следующие команды, чтобы создать структуру проекта Maven:
mkdir -p my-spark-app/src/main/java/com/examples cd my-spark-apppom.xmlСоздайте файл в корневом каталоге проекта со следующим содержимым:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.examples</groupId> <artifactId>my-spark-app</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.release>17</maven.compiler.release> <scala.binary.version>2.13</scala.binary.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- Included on serverless compute. --> <dependency> <groupId>com.databricks</groupId> <artifactId>databricks-connect_${scala.binary.version}</artifactId> <version>17.3.2</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <!-- Maven Shade Plugin - Creates a fat JAR with all non-provided dependencies. --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.6.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.examples.SparkJar</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>Создайте ваш основной класс в
src/main/java/com/examples/SparkJar.java:package com.examples; import org.apache.spark.sql.SparkSession; import java.util.stream.Collectors; public class SparkJar { public static void main(String[] args) { SparkSession spark = SparkSession.builder().getOrCreate(); // Prints the arguments to the class, which // are job parameters when run as a job: System.out.println(String.join(", ", args)); // Shows using spark: System.out.println(spark.version()); System.out.println( spark.range(10).limit(3).collectAsList().stream() .map(Object::toString) .collect(Collectors.joining(" ")) ); } }Чтобы создать JAR-файл, выполните следующую команду:
mvn clean packageСкомпилированный JAR-файл создается в папке
target/какmy-spark-app-1.0-SNAPSHOT.jar.
Управление зависимостями
Чтобы сделать библиотеку доступной для JAR-файла на бессерверных вычислениях:
-
Используйте предоставленную библиотеку: бессерверные вычисления включают Databricks Connect и курированный набор общих библиотек. Если ваша версия совместима, объявите ее
providedв сборке и не включайте ее в JAR-файл. - Присоединение к библиотеке среды: добавьте библиотеку в бессерверную среду , если она еще не предоставлена. Используйте это для библиотек, доступных только для среды выполнения, которые вы не хотите включать.
- Подключение к внешней базе данных: для источников JDBC используйте подключение JDBC вместо включения драйвера. Подключения JDBC управляются каталогом Unity. Учетные данные, происхождение и управление обрабатываются для вас.
Предоставленные библиотеки
Следующие библиотеки являются обязательными зависимостями и доступны по умолчанию для бессерверных вычислений. Объявите их provided при сборке. Включение собственных версий этих библиотек вызывает NoSuchMethodError во время выполнения.
Note
Перечисленные ниже версии библиотеки предназначены для бессерверной среды 4. Сведения о установленных библиотеках для других версий среды см. в справочнике по бессерверным версиям среды.
-
com.databricks:databricks-connect_2.13, версия 17.3.2 -
org.scala-lang:scala-library_2.13, версия 2.13.16 -
org.scala-lang:scala-reflect_2.13, версия 2.13.16 -
org.slf4j:slf4j-api, версия 2.0.10 -
org.apache.logging.log4j:log4j-api, версия 2.20.0 -
org.apache.logging.log4j:log4j-core, версия 2.20.0 -
org.apache.httpcomponents:httpclient, версия 4.5.14 -
org.apache.httpcomponents:httpcore, версия 4.4.16 -
com.fasterxml.jackson.core:jackson-databind, версия 2.15.2 -
com.fasterxml.jackson.core:jackson-core, версия 2.15.2 -
com.fasterxml.jackson.core:jackson-annotations, версия 2.15.2 -
com.fasterxml.jackson.datatype:jackson-datatype-jsr310, версия 2.15.2 -
com.google.guava:guava, версия 32.0.1-jre -
commons-io:commons-io, версия 2.14.0 -
org.json4s:json4s-jackson_2.13, версия 4.0.7 -
org.apache.commons:commons-lang3, версия 3.14.0 -
org.apache.commons:commons-configuration2, версия 2.11.0 -
org.apache.commons:commons-text, версия 1.12.0 -
com.databricks:databricks-sdk-java, версия 0.52.0 -
com.databricks:databricks-dbutils-scala_2.13, версия 0.1.4
Шаг 2. Создание задания для запуска JAR-файла
В рабочей области щелкните на
Задания и конвейеры на боковой панели.
Нажмите кнопку "Создать", а затем "Задание".
Щелкните плитку JAR , чтобы настроить первую задачу. Если плитка JAR недоступна, нажмите кнопку "Добавить другой тип задачи " и найдите JAR-файл.
При необходимости замените имя задания, которое по умолчанию является
New Job <date-time>, на нужное вам имя задания.В поле "Имя задачи" введите имя задачи, например
JAR_example.При необходимости выберите JAR в раскрывающемся меню "Тип ".
В Main class введите пакет и класс вашего JAR-файла. Если вы выполнили пример ранее, введите
com.examples.SparkJar.Для вычислений выберите бессерверные.
Настройте бессерверную среду:
- Выберите среду, затем щёлкните
Изменить, чтобы настроить её.
- Выберите 4 или выше для версии среды.
- Добавьте JAR-файл, перетащив его в селектор файлов или выбрав его из тома каталога Unity или расположения рабочей области.
- Выберите среду, затем щёлкните
Для параметров введите
["Hello", "World!"].Нажмите кнопку " Сохранить задачу".
Шаг 3. Запуск задания и просмотр сведений о выполнении задания
Щелкните
, чтобы запустить рабочий процесс. Чтобы просмотреть сведения о выполнении, щелкните Просмотреть выполнение в всплывающем окне Запущенного выполнения или щелкните ссылку в столбце Время начала для запуска в представлении выполнения заданий.
По завершении выполнения выходные данные отображаются на панели вывода , включая аргументы, переданные задаче.
Troubleshooting
В следующей таблице приведены сведения об устранении неполадок для распространенных исключений.
| Исключение | Причина | Исправление |
|---|---|---|
NoSuchMethodError, ссылающийся на класс scala.* |
JAR-файл, скомпилированный против Scala 2.12; Бессерверные запуски Scala 2.13 | Перекомпиляция с scalaVersion := "2.13.16". Убедитесь, что каждая зависимость Scala использует _2.13 суффикс между версиями. |
NoClassDefFoundError: scala/... |
Несоответствие между Scala 2.12 и 2.13 | Перекомпиляция с scalaVersion := "2.13.16". Убедитесь, что каждая зависимость Scala использует _2.13 суффикс между версиями. |
UnsupportedClassVersionError (версия файла класса выше 61) |
Скомпилировано с использованием JDK 18 или более поздней версии; в бессерверной среде используется JDK 17 | Используйте <maven.compiler.release>17</maven.compiler.release> (Maven) или --release 17 (sbt / javac) |
NoClassDefFoundError: org/apache/spark/...для внутреннего пакета (catalyst, , util, sql/utilsql/internalилиapi/javardd) |
Использовались внутренние компоненты Spark или API RDD. Они недоступны на бессерверных серверах. | Используйте общедоступный API Spark (DataFrame/Dataset/SQL). См. ограничения на бессерверные. |
ClassNotFoundException для класса драйвера JDBC (например, oracle.jdbc.OracleDriver) |
Драйвер JDBC отсутствует в пути к классам | Используйте подключение JDBC для внешней базы данных. |
ClassNotFoundException для стороннего класса (например, kotlin.jvm.internal.*) |
Библиотека не находится в бессерверном пути к классу. | Добавьте его в JAR-файл или предоставьте его в качестве дополнительного JAR-файла с помощью бессерверной среды. |
UnsatisfiedLinkError ссылка на файл в разделе /tmp/ |
Встроенная библиотека, включенная в JAR-файл | Нативные библиотеки не поддерживаются в serverless-среде. Используйте эквивалент чистого Java или выполните классические вычисления. |
NoSuchMethodError из сторонней библиотеки (Apache Commons, Guava, Jackson и т. д.) |
Используемая вами версия конфликтует с версией, предоставляемой serverless. | Используйте указанную версию. Пометьте это provided в своей сборке и не включайте это в JAR-файл. |
Дальнейшие действия
- Дополнительные сведения о задачах JAR см. в разделе JAR-задачи для заданий.
- Дополнительные сведения о создании совместимого JAR-файла см. в статье "Создание совместимого JAR-файла Azure Databricks".
- Дополнительные сведения о создании и выполнении заданий см. в разделе "Задания Lakeflow".