Databricks互換のJARを作成する
Javaアーカイブ(JAR)は、JavaまたはScalaコードをLakeFlowジョブにデプロイするためにパッケージ化します。JARの互換性要件を満たし、ターゲットコンピュートタイプに合わせてプロジェクトを構成してください。
自動デプロイメントおよび継続的インテグレーションワークフローには、宣言型オートメーションバンドルを使用して、事前構成されたビルドおよびデプロイメント設定を持つテンプレートからプロジェクトを作成します。宣言型オートメーションバンドルを使用したScala JARの構築とUnity CatalogにJARファイルをアップロードするバンドルを参照してください。このページでは、JARの要件とカスタム構成を理解するための手動アプローチについて説明します。
大まかに言えば、互換性のためには、JARは次の要件を満たす必要があります。
- バージョンを一致させます :コンピュートと同じJava Development Kit (JDK)、Scala、およびSparkバージョンを使用してください
- 依存関係の指定 :必要なライブラリをJARに含めるか、コンピュートにインストールします
- **「Databricks Spark セッションを使用」**:
SparkSession.builder().getOrCreate()を呼び出してセッションにアクセスします - JAR を許可リストに登録する (標準コンピュートのみ):JAR を許可リストに追加します。
プレビュー
サーバレスScalaおよびJavaジョブはパブリックプレビュー中です。JARタスクを使用してJARをデプロイできます。まだ有効になっていない場合は、Databricks プレビューの管理を参照してください。
コンピュートアーキテクチャ
サーバレス コンピュートと標準コンピュート は、ユーザー コードを分離し、Unity Catalog のガバナンスを適用するためにSpark Connect アーキテクチャを使用します。Databricks Connect には Spark Connect APIs が含まれています。サーバレス コンピュートと標準コンピュートでは、Spark Context または Spark RDD APIs を直接サポートしていません。サーバレスの制限事項と標準アクセスモードの制限事項を参照してください。
専用コンピュート は、従来の Spark アーキテクチャを使用し、すべての Spark API を含みます。
JDK、Scala、およびSparkのバージョンを見つけます。
コンピュートで実行されているJDK、Scala、およびSparkのバージョンを一致させます。
JARをビルドする際は、使用するJDK、Scala、Sparkのバージョンがコンピュートで実行されているバージョンと一致させる必要があります。これら3つのバージョンは相互に関連しています。Sparkのバージョンが互換性のあるScalaのバージョンを決定し、両方とも特定のJDKのバージョンに依存します。
コンピュートタイプに合った正しいバージョンを見つけるには、以下のステップに従ってください:
- Serverless
- Standard
- Dedicated
-
サーバレス環境のバージョン 4以上を使用してください。
-
サーバレス環境バージョンのテーブルで、お使いの環境のDatabricks Connect、JDK、およびScalaの各バージョンを見つけてください。
- サイドバーの
コンピュート をクリックし、コンピュートを選択してDatabricks Runtimeバージョンを表示します。
- Databricks Runtimeのメジャーバージョンとマイナーバージョンに一致するDatabricks Connectのバージョンを使用します (例: Databricks Runtime 17.3 → databricks-connect 17.x)。対応するJDKおよびScalaバージョンをバージョンサポートマトリックスで検索します。
- サイドバーの
コンピュート をクリックし、コンピュートを選択してDatabricks Runtimeバージョンを表示します。
- Databricks Runtime バージョンの リリースノート の System environment セクションで、JDK、Scala、Spark のバージョンを確認してください(例: Databricks Runtime 17.3 LTS )。
一致しないJDK、Scala、またはSparkのバージョンを使用すると、予期せぬ動作を引き起こしたり、コードの実行を妨げたりする可能性があります。
プロジェクトのセットアップ
バージョン要件を把握したら、ビルドファイルを設定し、JARをパッケージ化します。
JDKとScalaのバージョンを設定
正しいJDKおよびScalaのバージョンを使用するようにビルドファイルを構成してください。次の例は、Databricks Runtime 17.3 LTSとサーバレス環境バージョン4のバージョンを示しています。
- Sbt
- Maven
build.sbtで:
scalaVersion := "2.13.16"
javacOptions ++= Seq("-source", "17", "-target", "17")
pom.xmlで:
<properties>
<scala.version>2.13.16</scala.version>
<scala.binary.version>2.13</scala.binary.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
Spark の依存関係
JAR に Spark をパッケージ化せずに Spark API にアクセスするための Spark 依存関係を追加します。
- Serverless
- Standard access mode
- Dedicated access mode
Databricks Connectを使用する
Databricks Connect への依存関係を追加します(推奨)。Databricks Connect のバージョンは、サーバレス環境の Databricks Connect のバージョンと一致している必要があります。ランタイムに含まれているため、provided としてマークします。ビルドファイルに spark-core やその他の org.apache.spark アーティファクトのような Apache Spark の依存関係を含めないでください。Databricks Connect には、必要な Spark API がすべて含まれています。
Maven pom.xml:
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.+" % "provided"
代替: Spark SQL API
spark-sql-apiに対してコンパイルできますが、サーバレス コンピュートで実行されるSpark APIsはオープンソースのSparkとは若干異なる場合があるため、DatabricksではDatabricks Connectを使用することをお勧めします。これらのライブラリはランタイムに含まれているため、providedとしてマークします。
Maven pom.xml:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"
Databricks Connectを使用する
Databricks Connect への依存関係を追加します(推奨)。Databricks Connectのバージョンは、クラスターのDatabricks Runtimeのメジャーバージョンとマイナーバージョンと一致する必要があります(例: Databricks Runtime 17.3 → databricks-connect 17.x)。ランタイムに含まれているため、providedとしてマークしてください。ビルドファイルに、spark-coreやその他のorg.apache.sparkアーティファクトなど、Apache Sparkの依存関係を含めないでください。Databricks Connectには必要なすべてのSpark APIsがあります。
Maven pom.xml:
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.+" % "provided"
代替: Spark SQL API
Databricks Connect の代わりに spark-sql-api をコンパイル対象にできますが、サーバレスコンピュートで実行される Spark APIs はオープンソースの Spark と若干異なる場合があるため、Databricks は Databricks Connect の使用を推奨しています。これらのライブラリはランタイムに含まれているため、それらを provided としてマークします。
Maven pom.xml:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"
Databricks Connect または Spark APIs を使用する
Databricks Connectへの依存関係を追加します(推奨)、またはスコープprovidedでSparkライブラリに対してコンパイルします。
オプション1: Databricks Connect(推奨)
ランタイムに含まれているため、providedとしてマークしてください。
Maven pom.xml:
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.+" % "provided"
オプション2: Spark SQL API
spark-sql-api を対象としてコンパイルできますが、Databricks のバージョンとは若干異なる場合があるため、推奨されません。これらのライブラリはランタイムに含まれているため、provided としてマークします。
Maven pom.xml:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"
オプション 3: **その他の Spark ライブラリ**
クラスターで実行されているSparkのバージョンと一致している限り、スコープprovidedでApache Sparkライブラリ(たとえば、spark-coreまたはspark-sql)を使用できます。Databricks Runtimeリリースノート の「**システム環境**」セクションで、クラスターのSparkバージョンを見つけます。
アプリケーションの依存関係
アプリケーションの必要なライブラリをビルドファイルに追加してください。これらを管理する方法は、コンピュートタイプによって異なります:
- Serverless
- Standard access mode
- Dedicated access mode
サーバレスコンピュートはDatabricks Connectと、限られた依存関係のセットを提供します (リリースノートを参照)。他のすべてのライブラリをJARにパッケージ化するには、sbt-assemblyまたはMaven Shade Pluginを使用するか、サーバレス環境に追加します。
例として、JARにライブラリをパッケージ化するには:
Maven pom.xml:
<dependency>
<groupId>io.circe</groupId>
<artifactId>circe-core_2.13</artifactId>
<version>0.14.10</version>
</dependency>
sbt build.sbt:
libraryDependencies += "io.circe" %% "circe-core" % "0.14.10"
Databricks Runtime には、Spark 以外にも多くの共通ライブラリが含まれています。提供されているライブラリとバージョンの完全なリストは、お使いのDatabricks Runtime バージョン (例: Databricks Runtime 17.3 LTS) の Databricks Runtime リリースノート の**「システム環境」**セクションで確認してください。
Databricks Runtime が提供するライブラリについては、provided のスコープで依存関係として追加してください。例えば、Databricks Runtime 17.3 LTS には、protobuf-java が提供されます:
Maven pom.xml:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.25.5</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.google.protobuf" % "protobuf-java" % "3.25.5" % "provided"
Databricks Runtimeによって提供されていないライブラリについては、sbt-assemblyまたはMaven Shade Pluginを使用してJARにパッケージ化するか、コンピュートスコープライブラリとしてインストールします。
Databricks Runtime には、Spark 以外にも多くの共通ライブラリが含まれています。提供されているライブラリとバージョンの完全なリストは、お使いのDatabricks Runtime バージョン (例: Databricks Runtime 17.3 LTS) の Databricks Runtime リリースノート の**「システム環境」**セクションで確認してください。
Databricks Runtime が提供するライブラリについては、provided のスコープで依存関係として追加してください。例えば、Databricks Runtime 17.3 LTS には、protobuf-java が提供されます:
Maven pom.xml:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.25.5</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.google.protobuf" % "protobuf-java" % "3.25.5" % "provided"
Databricks Runtimeによって提供されていないライブラリについては、sbt-assemblyまたはMaven Shade Pluginを使用してJARにパッケージ化するか、コンピュートスコープライブラリとしてインストールします。
コード要件
JARコードを作成する際には、Databricksジョブとの互換性を確保するために、以下のパターンに従ってください。
Databricks Sparkセッションを使用する
ジョブでJARを実行する場合、Databricksによって提供されるSparkセッションを使用する必要があります。次のコードは、コードからセッションにアクセスする方法を示しています。
- Java
- Scala
SparkSession spark = SparkSession.builder().getOrCreate();
val spark = SparkSession.builder().getOrCreate()
try-finallyブロックを使用してジョブのクリーンアップを行う
ジョブの最後に確実に実行されるコードが必要な場合 (たとえば、一時ファイルをクリーンアップする場合) は、try-finallyブロックを使用します。ジョブではシャットダウンフックが確実に実行されないため、使用しないでください。
2つのパートで構成されるJARについて検討します。
jobBody()これには、ジョブの主要部分が含まれます。jobCleanup()jobBody()の後に実行する必要があり、その関数が成功するか、例外を返すかにかかわらず。
たとえば、jobBody()はテーブルを作成し、jobCleanup()はそれらのテーブルを削除します。
クリーンアップメソッドが呼び出されるようにする安全な方法は、コードに try-finally ブロックを配置することです。
try {
jobBody()
} finally {
jobCleanup()
}
sys.addShutdownHook(jobCleanup)または次のコードを使用してクリーンアップしようとしないでください。
// Do NOT clean up with a shutdown hook like this. This will fail.
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
DatabricksはSparkコンテナのライフタイムを管理しますが、これによりシャットダウンフックが確実に実行されなくなります。
ジョブパラメーターを読み取る
Databricksは、JSON文字列配列としてJARジョブにパラメーターを渡します。これらのパラメーターを使用するには、main関数に渡されたString配列を検査します。
パラメーターの詳細については、 ジョブのパラメータ化を参照してください。
追加構成
コンピュートタイプに応じて、追加の構成が必要になる場合があります:
- **標準アクセスモード**: セキュリティ上の理由から、管理者は JAR ライブラリの Maven 座標とパスを 許可リストに追加する必要があります。
- サーバレスコンピュート :ジョブがプライベートリソース(データベース、APIs、ストレージ)にアクセスする場合、ネットワーク接続構成(NCC)でネットワークを設定してください。サーバレスネットワークセキュリティを参照してください。
サーバレス コンピュートのロギングの設定
サーバレスコンピュートでは、SLF4JロギングAPIはno-operation (NOP) バックエンドをデフォルトで使用します。これにより、SLF4J を使用するライブラリおよびアプリケーションコードからのログメッセージは、暗黙的に破棄されます。
SLF4Jログ出力をLog4j 2バックエンドにルーティングするには、log4j-slf4j2-implブリッジをファットJARに、またはジョブに対する別のJAR依存関係として追加する必要があります。サーバレス環境には、Log4j 2 バックエンド(log4j-api および log4j-core)が含まれていますが、SLF4J を Log4j に接続するブリッジは、デフォルトではユーザーのクラスパス上にありません。
ブリッジバージョンは、「サーバレス環境のバージョン」で提供されているlog4j-apiのバージョンと一致する必要があります。たとえば、環境バージョン 5 は log4j-api バージョン 2.20.0 を使用しているため、log4j-slf4j2-impl バージョン 2.20.0 を追加する必要があります。
オプション1: ブリッジをファットJARに組み込む
log4j-slf4j2-implをコンパイル依存関係として追加して、fat JARにパッケージ化されるようにします。
- Sbt
- Maven
build.sbtで:
libraryDependencies += "org.apache.logging.log4j" % "log4j-slf4j2-impl" % "2.20.0"
pom.xmlで:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.20.0</version>
</dependency>
選択肢 2: ブリッジをジョブの個別のJAR依存関係として追加します
bridgeをfat JARにパッケージ化する代わりに、JARタスクを構成する際に、それを別のライブラリ依存関係として追加できます。「 環境とライブラリ 」のタスク設定で、Maven座標を使用してJAR依存関係を追加します:
org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0
サーバレスジョブにJAR依存関係を追加する方法の詳細については、「サーバレス環境の構成」を参照してください。
ファット JAR に「log4j-api」または「log4j-core」を含めないでください。これらのライブラリはサーバレス ランタイムによってすでに提供されているため、これらをバンドルするとバージョンの競合を引き起こす可能性があります。
その他のリソース
- ジョブで JAR を使用する方法について説明します。
- Databricks Connectについて学習します。
- DatabricksにおけるScalaについて学びます。