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

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

次のステップに従って、コンピュート タイプに適したバージョンを見つけてください。

  1. サーバレス環境バージョン4以降を使用してください
  2. サーバー環境バージョンテーブルで、ご使用の環境のDatabricks Connectバージョンを見つけます。 Databricks Connect のバージョンは、Spark のバージョンに対応しています。
  3. バージョン サポート マトリックスで、対応する JDK、Scala、Spark のバージョンを調べます。
注記

一致しない JDK、Scala、または Spark のバージョンを使用すると、予期しない動作が発生したり、コードが実行されなくなったりする可能性があります。

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

バージョン要件がわかったら、ビルド ファイルを構成し、JAR をパッケージ化します。

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

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

build.sbtの場合:

Scala
scalaVersion := "2.13.16"

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

Sparkの依存関係

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

Databricks Connectを使用する

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

Maven pom.xml :

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

sbt build.sbt :

Scala
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 :

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と限定された依存関係のセットを提供します (リリース ノートを参照)。 sbt-assemblyまたはMaven Shade Pluginを使用して他のすべてのライブラリをJARにパッケージ化するか、サーバレス環境に追加します。

たとえば、ライブラリを 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) を使用してネットワークを構成します。 「 サーバーレス ネットワーク セキュリティ 」を参照してください。

次のステップ