サーバレスコンピュートでJARを作成して実行する
Databricksは、このページで説明されているようなJARファイルを手動で構築およびデプロイするのではなく、宣言型自動化バンドルを使用することを強く推奨します。Declarative Automation Bundles を使用すると、適切なScala 、JDK、およびDatabricks Connectバージョンがすでにサーバーレス用に構成されているテンプレートからプロジェクトを簡単に作成でき、 DatabricksワークスペースへのJARの簡単なデプロイも可能になります。 宣言型自動化バンドルを使用してScala JARを構築する方法については、「宣言型自動化バンドルを使用してScala JARを構築する」を参照してください。
プレビュー
ScalaとJava Job はパブリック プレビュー段階にあります。
Javaアーカイブ(JAR)は、JavaまたはScalaのコードを単一のファイルにパッケージ化したものです。このページでは、 Sparkコードを使用してJARを作成し、それをサーバレスコンピュートにLakeFlow Jobとしてデプロイする方法を示します。 JARタスクを使用してJARデプロイできます。
要件
JARファイルを作成するには、ローカル開発環境に以下のものがインストールされている必要があります。
- Scala JARファイルにはsbt 1.11.7以降が必要です。
- Java JARファイルにはMaven 3.9.0以降が必要です。
- お使いの環境に合った JDK、 Scala 、およびDatabricks Connectバージョン。 依存関係のバージョンを参照してください。
依存関係のバージョン
サーバレス コンピュートで失敗せずに実行するには、 JAR Scalaおよび JDK のバージョンがランタイムScalaおよび JDK のバージョンと正確に一致する必要があります。 Databricks Connect のバージョンを参照してください。
このページの例ではレス環境バージョン4を使用しているため、このページでは以下のJARファイルを作成します。
- Scala 2.13 に対してコンパイルされています。すべての依存関係には
_2.13サフィックスが使用されています。 - JDK 17、クラスファイルバージョン61に対してコンパイルされています。
- サーバレス コンピュート用のSpark APIサーフェスであるDatabricks Connect 17.3 に対してコンパイルされています。
- 公開されているSpark APIsのみを使用します。 RDDもSparkの内部構造も一切使用していません。制限事項を参照してください。
- JARにすべての依存関係が含まれるか、サーバレス環境ライブラリとして添付されます。 依存関係の管理を参照してください。
制限事項
サーバレスコンピュートはSpark Connectを使用します。 JARはパブリックSpark APIs公開するシン クライアント ライブラリに対して実行され、 Sparkエンジン自体はサーバー側で実行されます。 パブリックAPIをバイパスするコードは、クラシック コンピュートであっても、 Catalyst最適化やPhotonアクセラレーションの恩恵を受けることができません。 RDDベースで内部構造に依存するコードは、一般的に同等のDataFrameやSQLコードよりも処理速度が遅くなります。
以下の商品はご利用いただけません。
- RDD API (
org.apache.spark.rdd.*) およびSparkContext/JavaSparkContext。代わりに、SparkSession.builder().getOrCreate()およびDataFrame /データセット操作を使用してください。 - Spark内部APIs (
org.apache.spark.catalyst.*、org.apache.spark.util.*、org.apache.spark.sql.util.*、org.apache.spark.sql.internal.*)。 これらのAPIsをインポートするコードはNoClassDefFoundErrorで失敗します。 Spark APIにリファクタリングする。 サードパーティライブラリが内部構造を使用している場合は、Spark Connect互換のリリースを公開しているかどうかを確認してください。 - ネイティブライブラリ(
.so、.dll、JNI)。サーバレス コンピュートでは、ネイティブ ライブラリをファイル システムに書き込むことはできません。 起動時にネイティブバイナリを展開するライブラリは、UnsatisfiedLinkErrorで失敗します。initスクリプトは回避策ではありません。 Java版が利用可能な場合は、それを使用してください。
ワークロードに上記のいずれかが必要な場合は、代わりに標準または専用のコンピュートで実行してください。
ステップ 1: JARを構築する
- Scala
- Java
-
Scala プロジェクトを作成するには、次のコマンドを実行します。
Bashsbt new scala/scala-seed.g8プロンプトが表示されたら、プロジェクト名(例:
my-spark-appを入力します。 -
次に、シードのスタブファイルを削除し、ソース用のディレクトリを作成します。
Bashcd 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ファイルの内容を次の内容に置き換えます。Scalaname := "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ファイルを編集または作成し、次の行を追加します。ScalaaddSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") -
src/main/scala/com/examples/SparkJar.scalaにメインクラスを作成します:Scalapackage 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 ファイルをビルドするには、次のコマンドを実行します。
Bashsbt assemblyコンパイルされた JAR ファイルは、
target/フォルダーにmy-spark-app-assembly-0.1.0-SNAPSHOT.jarとして作成されます。
-
次のコマンドを実行して、Maven プロジェクト構造を作成します。
Bashmkdir -p my-spark-app/src/main/java/com/examples
cd my-spark-app -
プロジェクト ルートに次の内容の
pom.xmlファイルを作成します。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>
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_${scala.binary.version}</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<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にメインクラスを作成します:Javapackage 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 ファイルをビルドするには、次のコマンドを実行します。
Bashmvn clean packageコンパイルされた JAR ファイルは、
target/フォルダーにmy-spark-app-1.0-SNAPSHOT.jarとして作成されます。
依存関係の管理
サーバレス コンピュート上のJARでライブラリを利用できるようにするには:
- 提供されたライブラリを使用する : サーバーレス コンピュートには、 Databricks Connectと厳選された共通ライブラリのセットが含まれています。 お使いのバージョンが互換性がある場合は、ビルド時に
providedと宣言し、JAR ファイルには含めないでください。 - 環境ライブラリとしてアタッチ : ライブラリがまだ提供されていない場合は、サーバレス環境にライブラリを追加します。 実行時のみに必要となるライブラリで、含めたくないものに使用してください。
- 外部データベースへの接続 : JDBCの場合、ドライバを含める代わりにJDBC接続を使用します。 JDBC接続はUnityカタログによって管理されます。認証情報、リネージ、ガバナンスはすべて自動的に処理されます。
提供ライブラリ
以下のライブラリは必須の依存関係であり、サーバレス コンピュート上で無償で入手できます。 ビルド時にそれらをprovided宣言してください。これらのライブラリの独自のバージョンをバンドルすると、ランタイム時にNoSuchMethodErrorがトリガーされます。
以下に示すライブラリのバージョンは 、サーバレス環境バージョン 4 用です。他の環境バージョンでインストールされているライブラリについては、サーバレス環境バージョンのメモのリファレンスを参照してください。
com.databricks:databricks-connect_2.13バージョン17.3.2org.scala-lang:scala-library_2.13バージョン2.13.16org.scala-lang:scala-reflect_2.13バージョン2.13.16org.slf4j:slf4j-apiバージョン2.0.10org.apache.logging.log4j:log4j-apiバージョン2.20.0org.apache.logging.log4j:log4j-coreバージョン2.20.0org.apache.httpcomponents:httpclientバージョン4.5.14org.apache.httpcomponents:httpcoreバージョン4.4.16com.fasterxml.jackson.core:jackson-databindバージョン2.15.2com.fasterxml.jackson.core:jackson-coreバージョン2.15.2com.fasterxml.jackson.core:jackson-annotationsバージョン2.15.2com.fasterxml.jackson.datatype:jackson-datatype-jsr310バージョン2.15.2com.google.guava:guavaバージョン 32.0.1-jrecommons-io:commons-ioバージョン2.14.0org.json4s:json4s-jackson_2.13バージョン4.0.7org.apache.commons:commons-lang3バージョン3.14.0org.apache.commons:commons-configuration2バージョン2.11.0org.apache.commons:commons-textバージョン1.12.0com.databricks:databricks-sdk-javaバージョン0.52.0com.databricks:databricks-dbutils-scala_2.13バージョン0.1.4
ステップ 2: JARを実行するジョブを作成する
-
ワークスペースで、サイドバーの
ジョブ & パイプライン をクリックします。
-
作成 をクリックし、 ジョブ をクリックします。
-
最初のタスクを構成するには、 JAR タイルをクリックします。 JAR タイルが利用できない場合は、 「別のタスク タイプを追加」 をクリックし、 JAR を検索します。
-
オプションで、ジョブの名前 (デフォルトは
New Job <date-time>) をジョブ名に置き換えます。 -
タスク 名 に、タスクの名前を入力します (例:
JAR_example)。 -
必要に応じて、「 タイプ 」ドロップダウン・メニューから「 JAR 」を選択します。
-
メインクラス には、JAR のパッケージとクラスを入力します。前の例に従った場合は、
com.examples.SparkJarと入力します。 -
コンピュート の場合は、 「サーバレス」 を選択します。
-
サーバーレス環境を構成します。
- 環境を選択し、クリックします
設定するには 編集してください 。
- 環境バージョン として 4 以上を選択します。
- JARファイルをファイルセレクターにドラッグアンドドロップして追加するか、 Unity Catalogボリュームまたはワークスペースの場所から参照して選択します。
- 環境を選択し、クリックします
-
この例では、 パラメーター に
["Hello", "World!"]と入力します。 -
「 タスクを作成 」をクリックします。
ステップ 3: ジョブを実行し、ジョブ実行の詳細を表示します
をクリックしてワークフローを実行します。 実行の詳細 を表示するには、 トリガーされた実行 ポップアップで 実行の表示 をクリックするか、ジョブの実行ビューで実行の 開始時刻 列のリンクをクリックします。
実行が完了すると、 出力 ペインに、タスクに渡した引数を含む出力が表示されます。
トラブルシューティング
以下の表は、よくある例外に関するトラブルシューティング情報を示しています。
例外 | 原因 | 修正 |
|---|---|---|
| Scala 2.12 に対してコンパイルされたJAR 。 サーバレス実行Scala 2.13 |
|
| Scala 2.12と2.13の不一致 |
|
| JDK 18 以降でコンパイルされています。 サーバレス実行 JDK 17 |
|
| Sparkの内部機能またはRDD APIが使用されました。これらは、 レスでは入手できません。 | パブリックSpark API ( DataFrame /データセット/ SQL ) を使用します。サーバレスの制限事項を参照してください。 |
| JDBCドライバがクラスパス上にありません | 外部データベースにはJDBC接続を使用してください。 |
| ライブラリはサーバレス クラスパス上にありません。 | JARに追加するか、または、品質レス環境を使用して追加のJARとして提供します。 |
| JARファイルに含まれるネイティブライブラリ | ネイティブライブラリはサーバレスではサポートされていません。 Pure Java の同等のもの、または従来のコンピュートでの実行を使用します。 |
| 同梱されているバージョンは、提供されているバージョンと競合します。 | 提供されているバージョンを使用してください。ビルド時に |
次のステップ
- JARタスクの詳細については、 「ジョブのJARタスク」を参照してください。
- 互換性のある JAR の作成の詳細については、 「Databricks 互換性のある JAR を作成する」を参照してください。
- ジョブの作成と実行の詳細については、Lakeflowジョブを参照してください。