サーバレスコンピュートでJARを作成して実行する
Databricksは、このページで説明されているようなJARファイルを手動で構築およびデプロイするのではなく、宣言型自動化バンドルを使用することを強く推奨します。Declarative Automation Bundles を使用すると、適切なScala 、JDK、およびDatabricks Connectバージョンがすでにサーバーレス用に構成されているテンプレートからプロジェクトを簡単に作成でき、 DatabricksワークスペースへのJARの簡単なデプロイも可能になります。 宣言型自動化バンドルを使用してScala JARを構築する方法については、「宣言型自動化バンドルを使用してScala JARを構築する」を参照してください。
Javaアーカイブ(JAR)は、JavaまたはScalaコードを単一のファイルにパッケージ化します。Sparkコードを含むJARを作成し、サーバレスコンピュート上にJARタスクとしてLakeFlow Jobにデプロイします。
要件
JARファイルを作成するには、ローカル開発環境に以下のものがインストールされている必要があります。
- Scala JARファイルにはsbt 1.11.7以降が必要です。
- Java JARファイルにはMaven 3.9.0以降が必要です。
- お使いの環境に合った JDK、 Scala 、およびDatabricks Connectバージョン。 依存関係のバージョンを参照してください。
依存関係のバージョン
サーバレス コンピュートで失敗せずに実行するには、 JAR Scalaおよび JDK のバージョンがランタイムScalaおよび JDK のバージョンと正確に一致する必要があります。 Databricks Connect のバージョンを参照してください。
このページの例ではレス環境バージョン4を使用しているため、このページでは以下のJARファイルを作成します。
- Scala 2.13 に対してコンパイルされています。すべての依存関係には
_2.13サフィックスが使用されています。 - JDK 17、クラスファイルバージョン61に対してコンパイルされています。
- サーバレス コンピュート用のSpark APIサーフェスであるDatabricks Connect 17.3 に対してコンパイルされています。
- 公開されているSpark APIsのみを使用します。 RDDもSparkの内部構造も一切使用していません。制限事項を参照してください。
- JARにすべての依存関係が含まれるか、サーバレス環境ライブラリとして添付されます。 依存関係の管理を参照してください。
制限事項
サーバレスコンピュートはSpark Connectを使用します。 JARはパブリックSpark APIs公開するシン クライアント ライブラリに対して実行され、 Sparkエンジン自体はサーバー側で実行されます。 パブリックAPIをバイパスするコードは、クラシック コンピュートであっても、 Catalyst最適化やPhotonアクセラレーションの恩恵を受けることができません。 RDDベースで内部構造に依存するコードは、一般的に同等のDataFrameやSQLコードよりも処理速度が遅くなります。
以下の商品はご利用いただけません。
- RDD API (
org.apache.spark.rdd.*) およびSparkContext/JavaSparkContext。代わりに、SparkSession.builder().getOrCreate()およびDataFrame /データセット操作を使用してください。 - Spark内部APIs (
org.apache.spark.catalyst.*、org.apache.spark.util.*、org.apache.spark.sql.util.*、org.apache.spark.sql.internal.*)。 これらのAPIsをインポートするコードはNoClassDefFoundErrorで失敗します。 Spark APIにリファクタリングする。 サードパーティライブラリが内部構造を使用している場合は、Spark Connect互換のリリースを公開しているかどうかを確認してください。 - ネイティブライブラリ(
.so、.dll、JNI)。サーバレス コンピュートでは、ネイティブ ライブラリをファイル システムに書き込むことはできません。 起動時にネイティブバイナリを展開するライブラリは、UnsatisfiedLinkErrorで失敗します。initスクリプトは回避策ではありません。 Java版が利用可能な場合は、それを使用してください。
ワークロードに上記のいずれかが必要な場合は、代わりに標準または専用のコンピュートで実行してください。
ステップ 1: JARを構築する
- Scala
- Java
-
Scala プロジェクトを作成するには、次のコマンドを実行します。
Bashsbt new scala/scala-seed.g8プロンプトが表示されたら、プロジェクト名(例:
my-spark-appを入力します。 -
次に、シードのスタブファイルを削除し、ソース用のディレクトリを作成します。
Bashcd my-spark-apprm src/main/scala/example/Hello.scalarm src/test/scala/example/HelloSpec.scalarm project/Dependencies.scalamkdir -p src/main/scala/com/examples -
build.sbtファイルの内容を次の内容に置き換えます。Scalaname := "my-spark-app"// Set the dependency versionsscalaVersion := "2.13.16"javacOptions ++= Seq("--release", "17")scalacOptions ++= Seq("-release", "17")libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.2" % "provided"// Your other dependencies go here. Use %% for Scala libraries so sbt picks the _2.13 artifact.// Fork a new JVM on run so our javaOptions are applied.fork := truejavaOptions += "--add-opens=java.base/java.nio=ALL-UNNAMED" -
project/plugins.sbtファイルを編集または作成し、次の行を追加します。ScalaaddSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") -
src/main/scala/com/examples/SparkJar.scalaにメインクラスを作成します:Scalapackage com.examplesimport org.apache.spark.sql.SparkSessionobject SparkJar {def main(args: Array[String]): Unit = {val spark = SparkSession.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 ファイルをビルドするには、次のコマンドを実行します。
Bashsbt assemblyコンパイルされた JAR ファイルは、
target/フォルダーにmy-spark-app-assembly-0.1.0-SNAPSHOT.jarとして作成されます。
-
次のコマンドを実行して、Maven プロジェクト構造を作成します。
Bashmkdir -p my-spark-app/src/main/java/com/examplescd my-spark-app -
プロジェクト ルートに次の内容の
pom.xmlファイルを作成します。XML<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.examples</groupId><artifactId>my-spark-app</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.release>17</maven.compiler.release><scala.binary.version>2.13</scala.binary.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.databricks</groupId><artifactId>databricks-connect_${scala.binary.version}</artifactId><version>17.3.2</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.6.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.examples.SparkJar</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build></project> -
src/main/java/com/examples/SparkJar.javaにメインクラスを作成します:Javapackage com.examples;import org.apache.spark.sql.SparkSession;import java.util.stream.Collectors;public class SparkJar {public static void main(String[] args) {SparkSession spark = SparkSession.builder().getOrCreate();// Prints the arguments to the class, which// are job parameters when run as a job:System.out.println(String.join(", ", args));// Shows using spark:System.out.println(spark.version());System.out.println(spark.range(10).limit(3).collectAsList().stream().map(Object::toString).collect(Collectors.joining(" ")));}} -
JAR ファイルをビルドするには、次のコマンドを実行します。
Bashmvn clean packageコンパイルされた JAR ファイルは、
target/フォルダーにmy-spark-app-1.0-SNAPSHOT.jarとして作成されます。
依存関係を管理する
サーバレス コンピュート上のJARでライブラリを利用できるようにするには:
- 提供されたライブラリを使用する : サーバーレス コンピュートには、 Databricks Connectと厳選された共通ライブラリのセットが含まれています。 お使いのバージョンが互換性がある場合は、ビルド時に
providedと宣言し、JAR ファイルには含めないでください。 - 環境ライブラリとしてアタッチ : ライブラリがまだ提供されていない場合は、サーバレス環境にライブラリを追加します。 実行時のみに必要となるライブラリで、含めたくないものに使用してください。
- 外部データベースへの接続 : JDBCの場合、ドライバを含める代わりにJDBC接続を使用します。 JDBC接続はUnityカタログによって管理されます。認証情報、リネージ、ガバナンスはすべて自動的に処理されます。
提供ライブラリ
以下のライブラリは必須の依存関係であり、サーバレス コンピュート上で無償で入手できます。 ビルド時にそれらをprovided宣言してください。これらのライブラリの独自のバージョンをバンドルすると、ランタイム時にNoSuchMethodErrorがトリガーされます。
以下に示すライブラリのバージョンは 、サーバレス環境バージョン 4 用です。他の環境バージョンでインストールされているライブラリについては、サーバレス環境バージョンのメモのリファレンスを参照してください。
com.databricks:databricks-connect_2.13バージョン17.3.2org.scala-lang:scala-library_2.13バージョン2.13.16org.scala-lang:scala-reflect_2.13バージョン2.13.16org.slf4j:slf4j-apiバージョン2.0.10org.apache.logging.log4j:log4j-apiバージョン2.20.0org.apache.logging.log4j:log4j-coreバージョン2.20.0org.apache.httpcomponents:httpclientバージョン4.5.14org.apache.httpcomponents:httpcoreバージョン4.4.16com.fasterxml.jackson.core:jackson-databindバージョン2.15.2com.fasterxml.jackson.core:jackson-coreバージョン2.15.2com.fasterxml.jackson.core:jackson-annotationsバージョン2.15.2com.fasterxml.jackson.datatype:jackson-datatype-jsr310バージョン2.15.2com.google.guava:guavaバージョン 32.0.1-jrecommons-io:commons-ioバージョン2.14.0org.json4s:json4s-jackson_2.13バージョン4.0.7org.apache.commons:commons-lang3バージョン3.14.0org.apache.commons:commons-configuration2バージョン2.11.0org.apache.commons:commons-textバージョン1.12.0com.databricks:databricks-sdk-javaバージョン0.52.0com.databricks:databricks-dbutils-scala_2.13バージョン0.1.4
ステップ 2: JARを実行するジョブを作成する
-
ワークスペースで、サイドバーの
ジョブ & パイプライン をクリックします。
-
作成 をクリックし、 ジョブ をクリックします。
-
最初のタスクを構成するには、 JAR タイルをクリックします。 JAR タイルが利用できない場合は、 「別のタスク タイプを追加」 をクリックし、 JAR を検索します。
-
オプションで、ジョブの名前 (デフォルトは
New Job <date-time>) をジョブ名に置き換えます。 -
タスク 名 に、タスクの名前を入力します (例:
JAR_example)。 -
必要に応じて、「 タイプ 」ドロップダウン・メニューから「 JAR 」を選択します。
-
メインクラス には、JAR のパッケージとクラスを入力します。前の例に従った場合は、
com.examples.SparkJarと入力します。 -
コンピュート の場合は、 「サーバレス」 を選択します。
-
サーバーレス環境を構成します。
- 環境を選択し、クリックします
設定するには 編集してください 。
- 環境バージョン として 4 以上を選択します。
- JARファイルをファイルセレクターにドラッグアンドドロップして追加するか、 Unity Catalogボリュームまたはワークスペースの場所から参照して選択します。
- 環境を選択し、クリックします
-
この例では、 パラメーター に
["Hello", "World!"]と入力します。 -
タスクの保存 をクリックします。
ステップ 3: ジョブを実行し、ジョブ実行の詳細を表示します
をクリックしてワークフローを実行します。 実行の詳細 を表示するには、 トリガーされた実行 ポップアップで 実行の表示 をクリックするか、ジョブの実行ビューで実行の 開始時刻 列のリンクをクリックします。
実行が完了すると、 出力 ペインに、タスクに渡した引数を含む出力が表示されます。
トラブルシューティング
以下の表は、よくある例外に関するトラブルシューティング情報を示しています。
例外 | 原因 | 修正 |
|---|---|---|
| Scala 2.12 に対してコンパイルされたJAR 。 サーバレス実行Scala 2.13 |
|
| Scala 2.12と2.13の不一致 |
|
| JDK 18 以降でコンパイルされています。 サーバレス実行 JDK 17 |
|
| Sparkの内部機能またはRDD APIが使用されました。これらは、 レスでは入手できません。 | パブリックSpark API ( DataFrame /データセット/ SQL ) を使用します。サーバレスの制限事項を参照してください。 |
| JDBCドライバがクラスパス上にありません | 外部データベースにはJDBC接続を使用してください。 |
| ライブラリはサーバレス クラスパス上にありません。 | JARに追加するか、または、品質レス環境を使用して追加のJARとして提供します。 |
| JARファイルに含まれるネイティブライブラリ | ネイティブライブラリはサーバレスではサポートされていません。 Pure Java の同等のもの、または従来のコンピュートでの実行を使用します。 |
| 同梱されているバージョンは、提供されているバージョンと競合します。 | 提供されているバージョンを使用してください。ビルド時に |
次のステップ
- JARタスクの詳細については、 「ジョブのJARタスク」を参照してください。
- 互換性のある JAR の作成の詳細については、 「Databricks 互換性のある JAR を作成する」を参照してください。
- ジョブの作成と実行の詳細については、Lakeflowジョブを参照してください。