Databricks互換のJARを作成する
このページでは、Databricks ワークスペースと互換性のある Scala または Java コードを使用して JAR を作成する方法について説明します。
大まかに言えば、JAR は互換性のために次の要件を満たしている必要があります。
- Java Development Kit (JDK) のバージョンは、 Databricksクラスターまたはサーバレス コンピュートの JDK バージョンと一致します。
 - Scalaの場合、 ScalaのバージョンはDatabricksクラスターまたはサーバーレス コンピュートのScalaバージョンと一致します。
 - Databricks Connect依存関係として追加され、 Databricksまたはサーバーレス コンピュートで実行されているバージョンと一致します。または、Spark 依存関係はDatabricks環境と互換性があります。
 - コンパイルしているローカル プロジェクトは単一の JAR としてパッケージ化されており、提供されていない依存関係がすべて含まれています。あるいは、環境またはクラスターに追加することもできます。
 - JAR ファイル内のコードは、Spark セッションまたはコンテキストと正しく対話します。
 - 標準コンピュートの場合、使用されるすべての JAR が許可リストに追加されます。
 
サーバレス コンピュートにJARデプロイして実行するように完全に構成されたJavaまたはScalaプロジェクトを作成するには、 Databricksアセット バンドルを使用できます。 JAR をアップロードするバンドル構成の例については、 「Unity Catalog に JAR ファイルをアップロードするバンドル」を参照してください。Databricks アセット バンドルを使用して Scala プロジェクトを作成するには、 「Databricks アセット バンドルを使用して Scala JAR をビルドする」を参照してください。
ベータ版
JARタスクに対するサーバレスコンピュートの使用はベータ版です。
Databricks Connect と Databricks Runtime のバージョン管理
Databricksで実行するJAR作成するときは、 Spark APIs呼び出す方法と、呼び出すAPIsのバージョンを理解しておくと役立ちます。
Databricks Connect
Databricks Connect は、クライアント コンポーネントとサーバー コンポーネントを分離する Spark Connect アーキテクチャを実装します。この分離により、行フィルターや列マスクなどの手段を使用して Unity Catalog ガバナンスを完全に適用しながら、クラスターを効率的に共有できます。ただし、標準アクセス モードのUnity Catalogクラスターには、 Spark Context や RDD などのAPIsがサポートされていないなど、いくつかの制限があります。 制限事項は、「標準コンピュートの要件と制限事項」に記載されています。
Databricks Connectと、 Spark Connect を含むすべてのSpark機能にアクセスでき、標準およびサーバーレス コンピュートに含まれています。 これらのコンピュート タイプの場合、必要なSpark APIsすべて提供されるため、 Databricks Connectが必要です。
Databricks Runtime
Databricksによって管理されるコンピュート上のDatabricks Runtime実行。 Spark をベースにしていますが、使いやすさを向上させるためにパフォーマンスの改善やその他の機能強化が加えられています。
サーバーレスまたは標準コンピュートでは、 Databricks Connectコンピュート上で実行されているDatabricks Runtimeを呼び出すAPIsを提供します。 専用のコンピュートでは、コンピュート上のDatabricks RuntimeによってサポートされるSpark APIsに対してコンパイルします。
コンピュートの正しいバージョンを見つけてください
互換性のあるJARファイルをコンパイルするには、コンピュートが実行しているDatabricks ConnectとDatabricks Runtimeのバージョンを知っておく必要があります。
クラスタータイプ  | 正しいバージョンを見つける方法  | 
|---|---|
サーバーレス  | Databricks Connect を使用します。環境バージョン 4 以上をサーバレスする必要があります。 サーバレス環境の現在のDatabricks Connectバージョンを確認するには、 「サーバレス環境のバージョン」を参照してください。 バージョン サポート マトリックスで、Databricks Connect バージョンの JDK および Scala バージョンを見つけます。  | 
標準モードでのコンピュート  | Databricks Runtime使用し、 APIs呼び出すためのDatabricks Connect提供します。 コンピュートのDatabricks Runtimeバージョンを確認するには: 
 Databricks Connect バージョンのメジャー バージョンとマイナー バージョン値は、Databricks Runtime バージョンのメジャー バージョンとマイナー バージョン値と一致します。  | 
専用モードでのコンピュート  | Databricks Runtime使用し、 Spark APIsに対して直接コンパイルできます。 コンピュート クラスターのDatabricks Runtimeバージョンを確認するには: 
  | 
JDKとScalaのバージョン
JARビルドする場合、コードのコンパイルに使用するJava Development Kit (JDK) とScalaバージョンは、コンピュート上で実行されているバージョンと一致する必要があります。
サーバーレスまたは標準コンピュートの場合は、 Databricks Connectバージョンを使用して、互換性のある JDK およびScalaバージョンを見つけます。 バージョン サポート マトリックスを参照してください。
専用のコンピュートを使用している場合は、コンピュート上のDatabricks Runtimeの JDK およびScalaバージョンを一致させる必要があります。 Databricks Runtimeリリースノート の各 バージョンのバージョンと互換性の システム環境 セクションには、正しい Databricks Runtime JavaおよびScala バージョンが含まれています。たとえば、Databricks Runtime 17.3 LTS の場合は、 「Databricks Runtime 17.3 LTS」を参照してください。
コンピュートの JDK またはScalaバージョンと一致しない JDK またはScalaバージョンを使用すると、予期しない動作が発生したり、コードが実行されなくなったりする可能性があります。
依存関係
ビルド ファイルで依存関係を正しく設定する必要があります。
Databricks Connect または Apache Spark
標準またはサーバーレス コンピュートの場合、 Databricks JAR を構築するためにSparkではなくDatabricks Connectへの依存関係を追加することをお勧めします。 Databricks Runtime は Spark と同一ではなく、パフォーマンスと安定性が向上しています。Databricks Connect Databricksで使用できるSpark APIsを提供します。 Databricks Connect を含めるには、依存関係を追加します。
- Java
 - Scala
 
Maven pom.xmlファイル内:
<dependency>
  <groupId>com.databricks</groupId>
  <artifactId>databricks-connect_2.13</artifactId>
  <version>17.0.2</version>
</dependency>
build.sbtファイル内:
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.0.2"
Databricks Connect のバージョンは、クラスターの Databricks Runtime に含まれているバージョンと一致する必要があります。
Databricks では、Databricks Connect を利用することを推奨しています。Databricks Connect を使用しない場合は、 spark-sql-apiに対してコンパイルします。この特定の Spark ライブラリを依存関係に追加しますが、ライブラリを JAR に含めないでください。ビルド ファイルで、依存関係のスコープをprovidedとして構成します。
- Java
 - Scala
 
Maven pom.xmlファイル内:
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>
build.sbtファイル内:
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"
Sparkの依存関係
標準のコンピュートとサーバレスの場合は、プロジェクトに他のSpark依存関係を含めないでください。 Databricks Connect使用すると、必要なSparkセッションAPIsすべて提供されます。
Classic コンピュートおよびDatabricks Runtimeが提供するライブラリ
クラシック コンピュート (専用モードまたは標準モード) で実行している場合、 Databricks Runtimeは多くの共通ライブラリが含まれています。 Databricks Runtimeバージョンの リリース ノート の 「システム環境」 セクションに含まれるライブラリとバージョンを見つけます。Databricks Runtimeたとえば、 Databricks Runtime 17.3 LTS システム環境セクションには、Databricks Runtime で使用できる各ライブラリのバージョンが一覧表示されます。
これらのライブラリのいずれかに対してコンパイルするには、 providedオプションを使用して依存関係として追加します。たとえば、Databricks Runtime 17.3 LTS では、 protobuf-javaライブラリが提供されており、次の構成を使用してコンパイルできます。
- Java
 - Scala
 
Maven pom.xmlの場合:
<dependency>
  <groupId>com.google.protobuf</groupId>
  <artifactId>protobuf-java</artifactId>
  <version>3.25.5</version>
  <scope>provided</scope>
</dependency>
build.sbtの場合:
libraryDependencies += "com.google.protobuf" %% "protobuf-java" % "3.25.5" % "provided"
サーバレス、非提供ライブラリ
サーバーレスは、ライブラリの競合によって引き起こされる問題を軽減するために、依存関係を自動的に削減したセットを提供します。
サーバーレス コンピュートまたはDatabricks Runtimeで利用できないライブラリについては、自分でJARに含めることができます。 たとえば、 build.sbtファイルにcirce-coreを含めるには、次のコマンドを追加します。
libraryDependencies += "io.circe" %% "circe-core" % "0.14.10"
サーバーレス環境にライブラリを追加するには、 「ノートブック以外のジョブタスクの環境を構成する」を参照してください。
単一のJARとしてパッケージ化
Databricks では、アプリケーションとすべての依存関係を単一の JAR ファイル ( über JAR または fat JAR とも呼ばれる) にパッケージ化することを推奨しています。sbt の場合はsbt-assemblyを使用し、Maven の場合はmaven-shade-pluginを使用します。詳細については、公式のMaven Shade プラグインとsbt-assembly のドキュメントを参照してください。
あるいは、依存関係をクラスタースコープのライブラリとしてインストールすることもできます。詳細については、「コンピュート スコープのライブラリ」を参照してください。 クラスターにライブラリをインストールする場合は、jar にライブラリがパッケージ化されるのを避けるために、コード内の依存関係にprovidedキーワードを含める必要があります。 サーバレスの場合は、ご利用のサーバレス環境に追加してください。 「ノートブック以外のジョブ タスクの環境を構成する」を参照してください。
Unity Catalog標準クラスターにライブラリとしてインストールされたScala JARの場合、JAR ライブラリ内のクラスはcom.databricks.MyClass などの名前付きパッケージに含まれている必要があり、そうでない場合はライブラリのインポート時にエラーが発生します。
コード内でSparkセッションを使用する
ジョブ内で JAR を実行する場合は、ジョブ用に Databricks によって提供される Spark セッションを使用する必要があります。次のコードは、コードからセッションにアクセスする方法を示しています。
- Java
 - Scala
 
SparkSession spark = SparkSession.builder().getOrCreate();
val spark = SparkSession.builder().getOrCreate()
JARホワイトリストに登録されていることを確認します (標準コンピュート)
セキュリティ上の理由から、標準アクセスモードでは、管理者が JAR ライブラリの Maven 座標とパスを許可リストに追加する必要があります。標準アクセスモード (旧称 共有アクセスモード) のコンピュートにおけるライブラリと initスクリプトの許可リストを参照してください。
推奨事項: ジョブのクリーンアップには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 コンテナーの有効期間が管理される方法のため、シャットダウン フックは確実に実行されません。
ジョブを読み取り中
パラメータは JSON 文字列配列とともに JAR ジョブに渡されます。これらの問題にアクセスするには、 main関数に渡されたString配列を検査します。
問題の詳細については、 「ジョブのパラメータ化」を参照してください。
サーバレスネットワークを構成する
ジョブがプライベート リソース (データベース、 APIs 、ストレージ) にアクセスする場合は、ネットワーク接続構成 (NCC) を使用してネットワークを構成します。 「 サーバーレス ネットワーク セキュリティ 」を参照してください。
JARを作成する
次の手順では、 ScalaまたはJava使用して、 Databricksで動作する単純なJARファイルを作成し、コンパイルする手順を説明します。
要件
ローカル開発環境には以下が必要です。
- Java 開発キット (JDK) 17。
 - sbt (Scala JAR 用)。
 - Databricks CLI バージョン 0.218.0 以上。インストールされている Databricks CLI のバージョンを確認するには、コマンド
databricks -vを実行します。Databricks CLI をインストールするには、 「Databricks CLI のインストールまたは更新」を参照してください。 - Databricks CLI 認証は
DEFAULTプロファイルで構成されています。認証を構成するには、 「ワークスペースへのアクセスを構成する」を参照してください。 
Scala JARを作成する
- 
新しい Scala プロジェクトを作成するには、次のコマンドを実行します。
> sbt new scala/scala-seed.g8プロンプトが表示されたら、プロジェクト名(例:
my-spark-appを入力します。 - 
build.sbtファイルの内容を次の内容に置き換えます。コンピュートに必要なScalaおよびDatabricks Connectバージョンを選択します。 依存関係を参照してください。ScalascalaVersion := "2.13.16"
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.0.1"
// other dependencies go here...
// to run with new jvm options, a fork is required otherwise it uses same options as sbt process
fork := true
javaOptions += "--add-opens=java.base/java.nio=ALL-UNNAMED" - 
project/assembly.sbtファイルを編集または作成し、次の行を追加します。addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") - 
src/main/scala/example/DatabricksExample.scalaにメインクラスを作成します:Scalapackage com.examples
import com.databricks.connect.DatabricksSession
import org.apache.spark.sql.{SparkSession}
object SparkJar {
def main(args: Array[String]): Unit = {
val spark: SparkSession = DatabricksSession.builder().getOrCreate()
// Prints the arguments to the class, which
// are job parameters when run as a job:
println(args.mkString(", "))
// Shows using spark:
println(spark.version)
println(spark.range(10).limit(3).collect().mkString(" "))
}
} - 
JAR ファイルをビルドするには、次のコマンドを実行します。
Bash> sbt assembly 
Java JARを作成する
- 
JAR 用のフォルダーを作成します。
 - 
フォルダー内に、次の内容を含む
PrintArgs.javaという名前のファイルを作成します。Javaimport java.util.Arrays;
public class PrintArgs {
public static void main(String[] args) {
System.out.println(Arrays.toString(args));
}
} - 
PrintArgs.javaファイルをコンパイルすると、ファイルPrintArgs.classが作成されます。Bashjavac PrintArgs.java - 
(オプション) コンパイルされたプログラムを実行します。
Bashjava PrintArgs Hello World!
# [Hello, World!] - 
フォルダー内に
pom.xmlファイルを作成し、次のコードを追加して Maven シェードを有効にします。<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build> - 
JAR フォルダーに、
META-INFという名前のフォルダーを作成します。 - 
META-INFフォルダーに、次の内容を含むMANIFEST.MFという名前のファイルを作成します。このファイルの最後に必ず改行を追加してください。Main-Class: PrintArgs - 
JAR フォルダーから、
PrintArgs.jarという名前の JAR を作成します。Bashjar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class - 
(オプション) テストするには、JAR を実行します。
Bashjava -jar PrintArgs.jar Hello World!
# [Hello, World!] 
エラーno main manifest attribute, in PrintArgs.jarが発生した場合は、必ずMANIFEST.MFファイルの末尾に改行を追加してから、JAR を再度作成して実行してください。
次のステップ
- ジョブで jar を使用する方法を学びます。
 - Databricks Connectについて学びます。
 - Databricks で Scalaについて学びます。