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

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() を呼び出してセッションにアクセスします
  • サポートされているスレッドプールの使用 (Unity Catalog を使用する専用コンピュートのみ): ThreadUtils.newDaemonFixedThreadPool など、サポートされている ThreadUtils スレッドプールを使用します。その他のスレッドプールはサポートされていません。
  • JAR を許可リストに登録する (標準コンピュートのみ):JAR を許可リストに追加します。

コンピュートアーキテクチャ​

サーバレス コンピュートと標準コンピュート は、ユーザー コードを分離し、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();

Unity Catalogでサポートされているスレッドプールを使用する​

Unity Catalogデータにアクセスする専用コンピュート上のJARタスクについては、org.apache.spark.util.ThreadUtilsのサポートされているスレッドプール(ThreadUtils.newDaemonFixedThreadPoolやThreadUtils.newDaemonCachedThreadPoolなど)を使用してください。

ForkJoinPool、.parやThreadUtils.newForkJoinPoolなどの Scala パラレル コレクション、および任意の ScheduledExecutorService スレッド プールを含め、その他のスレッド プールはサポートされていません。制限事項を参照してください。

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のバージョンと一致する必要があります。たとえば、環境バージョン 5 は log4j-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」を含めないでください。これらのライブラリはサーバレス ランタイムによってすでに提供されているため、これらをバンドルするとバージョンの競合を引き起こす可能性があります。

その他のリソース​