メインコンテンツまでスキップ

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のバージョンに依存します。

コンピュートタイプに合った正しいバージョンを見つけるには、以下のステップに従ってください:

  1. サーバレス環境のバージョン 4以上を使用してください。

  2. サーバレス環境バージョンのテーブルで、お使いの環境のDatabricks Connect、JDK、およびScalaの各バージョンを見つけてください。

注記

一致しないJDK、Scala、またはSparkのバージョンを使用すると、予期せぬ動作を引き起こしたり、コードの実行を妨げたりする可能性があります。

プロジェクトのセットアップ

バージョン要件を把握したら、ビルドファイルを設定し、JARをパッケージ化します。

JDKとScalaのバージョンを設定

正しいJDKおよびScalaのバージョンを使用するようにビルドファイルを構成してください。次の例は、Databricks Runtime 17.3 LTSとサーバレス環境バージョン4のバージョンを示しています。

build.sbtで:

Scala
scalaVersion := "2.13.16"

javacOptions ++= Seq("-source", "17", "-target", "17")

Spark の依存関係

JAR に Spark をパッケージ化せずに Spark API にアクセスするための Spark 依存関係を追加します。

Databricks Connectを使用する

Databricks Connect への依存関係を追加します(推奨)。Databricks Connect のバージョンは、サーバレス環境の Databricks Connect のバージョンと一致している必要があります。ランタイムに含まれているため、provided としてマークします。ビルドファイルに spark-core やその他の org.apache.spark アーティファクトのような Apache Spark の依存関係を含めないでください。Databricks Connect には、必要な Spark API がすべて含まれています。

Maven pom.xml:

XML
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>

sbt build.sbt:

Scala
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.+" % "provided"

代替: Spark SQL API

spark-sql-apiに対してコンパイルできますが、サーバレス コンピュートで実行されるSpark APIsはオープンソースのSparkとは若干異なる場合があるため、DatabricksではDatabricks Connectを使用することをお勧めします。これらのライブラリはランタイムに含まれているため、providedとしてマークします。

Maven pom.xml:

XML
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>

sbt build.sbt:

Scala
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"

アプリケーションの依存関係

アプリケーションの必要なライブラリをビルドファイルに追加してください。これらを管理する方法は、コンピュートタイプによって異なります:

サーバレスコンピュートはDatabricks Connectと、限られた依存関係のセットを提供します (リリースノートを参照)。他のすべてのライブラリをJARにパッケージ化するには、sbt-assemblyまたはMaven Shade Pluginを使用するか、サーバレス環境に追加します。

例として、JARにライブラリをパッケージ化するには:

Maven pom.xml:

XML
<dependency>
<groupId>io.circe</groupId>
<artifactId>circe-core_2.13</artifactId>
<version>0.14.10</version>
</dependency>

sbt build.sbt:

Scala
libraryDependencies += "io.circe" %% "circe-core" % "0.14.10"

コード要件

JARコードを作成する際には、Databricksジョブとの互換性を確保するために、以下のパターンに従ってください。

Databricks Sparkセッションを使用する

ジョブでJARを実行する場合、Databricksによって提供されるSparkセッションを使用する必要があります。次のコードは、コードからセッションにアクセスする方法を示しています。

Java
SparkSession spark = SparkSession.builder().getOrCreate();

try-finallyブロックを使用してジョブのクリーンアップを行う

ジョブの最後に確実に実行されるコードが必要な場合 (たとえば、一時ファイルをクリーンアップする場合) は、try-finallyブロックを使用します。ジョブではシャットダウンフックが確実に実行されないため、使用しないでください。

2つのパートで構成されるJARについて検討します。

  • jobBody() これには、ジョブの主要部分が含まれます。
  • jobCleanup() jobBody()の後に実行する必要があり、その関数が成功するか、例外を返すかにかかわらず。

たとえば、jobBody()はテーブルを作成し、jobCleanup()はそれらのテーブルを削除します。

クリーンアップメソッドが呼び出されるようにする安全な方法は、コードに try-finally ブロックを配置することです。

Scala
try {
jobBody()
} finally {
jobCleanup()
}

sys.addShutdownHook(jobCleanup)または次のコードを使用してクリーンアップしようとしないでください。

Scala
// 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のバージョンと一致する必要があります。たとえば、環境バージョン 5log4j-api バージョン 2.20.0 を使用しているため、log4j-slf4j2-impl バージョン 2.20.0 を追加する必要があります。

オプション1: ブリッジをファットJARに組み込む

log4j-slf4j2-implをコンパイル依存関係として追加して、fat JARにパッケージ化されるようにします。

build.sbtで:

Scala
libraryDependencies += "org.apache.logging.log4j" % "log4j-slf4j2-impl" % "2.20.0"

選択肢 2: ブリッジをジョブの個別のJAR依存関係として追加します

bridgeをfat JARにパッケージ化する代わりに、JARタスクを構成する際に、それを別のライブラリ依存関係として追加できます。「 環境とライブラリ 」のタスク設定で、Maven座標を使用してJAR依存関係を追加します:

org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0

サーバレスジョブにJAR依存関係を追加する方法の詳細については、「サーバレス環境の構成」を参照してください。

注記

ファット JAR に「log4j-api」または「log4j-core」を含めないでください。これらのライブラリはサーバレス ランタイムによってすでに提供されているため、これらをバンドルするとバージョンの競合を引き起こす可能性があります。

その他のリソース