Databricks互換のJARを作成する
Javaアーカイブ ( JAR ) は、 LakeFlowジョブにデプロイするためのJavaまたはScalaコードをパッケージ化します。 この記事では、さまざまなコンピュート タイプのJAR互換性要件とプロジェクト構成について説明します。
自動デプロイと継続的インテグレーション ワークフローの場合は、Databricks アセット バンドルを使用して、事前に構成されたビルドおよびデプロイ設定を含むテンプレートからプロジェクトを作成します。Databricksアセット バンドルを使用してScala JARをビルドする」およびJARファイルをUnity Catalogにアップロードするバンドル」を参照してください。 この記事では、JAR 要件とカスタム構成を理解するための手動アプローチについて説明します。
大まかに言えば、JAR は互換性のために次の要件を満たしている必要があります。
- バージョンを一致させる : コンピュートと同じJava Development Kit (JDK)、 Scala 、およびSparkバージョンを使用します。
- 依存関係を提供する : 必要なライブラリをJARに含めるか、コンピュートにインストールします。
- Databricks Sparkセッションを使用します : セッションにアクセスするには
SparkSession.builder().getOrCreate()を呼び出します - JARをホワイトリストに追加する (標準コンピュートのみ): JARをホワイトリストに追加します。
ベータ版
ScalaとJava Job はベータ版です。 JAR タスクを使用して JAR をデプロイできます。まだ有効になっていない場合は、 「Databricks プレビューの管理」を参照してください。
コンピュート建築
サーバーレスと標準コンピュートは、 Spark Connect アーキテクチャを使用してユーザー コードを分離し、 Unity Catalogガバナンスを強化します。 Databricks Connect Spark Connect APIsへのアクセスを提供します。 サーバレスおよび標準コンピュートは、 Spark Context またはSpark RDD APIsサポートしません。 サーバレスの制限および標準アクセス モードの制限を参照してください。
専用コンピュートは、 クラシックなSparkアーキテクチャを使用し、すべてのSpark APIsへのアクセスを提供します。
JDK、Scala、Sparkのバージョンを確認する
コンピュートで実行されている JDK、 Scala 、およびSparkバージョンを一致させる
JARをビルドするときは、JDK、 Scala 、およびSparkバージョンがコンピュートで実行されているバージョンと一致する必要があります。 これら 3 つのバージョンは相互に関連しており、Spark バージョンによって互換性のある Scala バージョンが決定され、どちらも特定の JDK バージョンに依存します。
次のステップに従って、コンピュート タイプに適したバージョンを見つけてください。
- Serverless
- Standard
- Dedicated
- サーバレス環境バージョン4以降を使用してください
- サーバー環境バージョンテーブルで、ご使用の環境のDatabricks Connectバージョンを見つけます。 Databricks Connect のバージョンは、Spark のバージョンに対応しています。
- バージョン サポート マトリックスで、対応する JDK、Scala、Spark のバージョンを調べます。
- クリック
サイドバーで コンピュート を選択し、 Databricks Runtimeバージョンを表示します。
- Databricks Runtime のメジャー バージョンとマイナー バージョンに一致する Databricks Connect バージョンを使用します (例: DBR 17.3 → databricks-connect 17.x)
- バージョン サポート マトリックスで、一致する JDK、Scala、および Spark バージョンを検索します。Databricks Connect のバージョンは、Spark のバージョンに対応しています。
- クリック
サイドバーで コンピュート を選択し、 Databricks Runtimeバージョンを表示します。
- バージョン (例:Databricks Runtime 17.3LTS ) のリリースノート の システム環境 セクションで、JDK、Scala 、およびSpark バージョンを見つけます。Databricks Runtime
一致しない JDK、Scala、または Spark のバージョンを使用すると、予期しない動作が発生したり、コードが実行されなくなったりする可能性があります。
プロジェクトのセットアップ
バージョン要件がわかったら、ビルド ファイルを構成し、JAR をパッケージ化します。
JDKとScalaのバージョンを設定する
正しい JDK および Scala バージョンを使用するようにビルド ファイルを構成します。次の例はDatabricks Runtime 17.3 LTSとサーバーレス環境バージョン 4 - Scala -preview のバージョンを示しています。
- 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 APIsアクセスするための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 APIsを提供します。
Maven pom.xml :
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.0.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt :
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.0.2" % "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を使用する
Databricks Connect への依存関係を追加します (推奨)。Databricks Connect のバージョンは、クラスターのメジャーおよびマイナー Databricks Runtime バージョンと一致する必要があります (例: DBR 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.0.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt :
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.0.2" % "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.0.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt :
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.0.2" % "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と限定された依存関係のセットを提供します (リリース ノートを参照)。 sbt-assemblyまたはMaven Shade Pluginを使用して他のすべてのライブラリをJARにパッケージ化するか、サーバレス環境に追加します。
たとえば、ライブラリを 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 バージョン (Databricks Runtime 17.3LTS など) の Databricks Runtimeリリース ノートの「 システム環境」 セクションで確認できます。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 バージョン (Databricks Runtime 17.3LTS など) の Databricks Runtimeリリース ノートの「 システム環境」 セクションで確認できます。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) を使用してネットワークを構成します。 「 サーバーレス ネットワーク セキュリティ 」を参照してください。
次のステップ
- ジョブで jar を使用する方法を学びます。
- Databricks Connectについて学びます。
- Databricks で Scalaについて学びます。