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

サーバレスコンピュートでJARを作成して実行する

重要

Databricksは、このページで説明されているようなJARファイルを手動で構築およびデプロイするのではなく、宣言型自動化バンドルを使用することを強く推奨します。Declarative Automation Bundles を使用すると、適切なScala 、JDK、およびDatabricks Connectバージョンがすでにサーバーレス用に構成されているテンプレートからプロジェクトを簡単に作成でき、 DatabricksワークスペースへのJARの簡単なデプロイも可能になります。 宣言型自動化バンドルを使用してScala JARを構築する方法については、「宣言型自動化バンドルを使用してScala JARを構築する」を参照してください。

備考

プレビュー

ScalaとJava Job はパブリック プレビュー段階にあります。

Javaアーカイブ(JAR)は、JavaまたはScalaのコードを単一のファイルにパッケージ化したものです。このページでは、 Sparkコードを使用してJARを作成し、それをサーバレスコンピュートにLakeFlow Jobとしてデプロイする方法を示します。 JARタスクを使用してJARデプロイできます。

要件

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を構築する

  1. Scala プロジェクトを作成するには、次のコマンドを実行します。

    Bash
    sbt new scala/scala-seed.g8

    プロンプトが表示されたら、プロジェクト名(例: my-spark-appを入力します。

  2. 次に、シードのスタブファイルを削除し、ソース用のディレクトリを作成します。

    Bash
    cd my-spark-app
    rm src/main/scala/example/Hello.scala
    rm src/test/scala/example/HelloSpec.scala
    rm project/Dependencies.scala
    mkdir -p src/main/scala/com/examples
  3. build.sbtファイルの内容を次の内容に置き換えます。

    Scala
    name := "my-spark-app"

    // Set the dependency versions
    scalaVersion := "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 := true
    javaOptions += "--add-opens=java.base/java.nio=ALL-UNNAMED"
  4. project/plugins.sbtファイルを編集または作成し、次の行を追加します。

    Scala
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1")
  5. src/main/scala/com/examples/SparkJar.scalaにメインクラスを作成します:

    Scala
    package com.examples

    import org.apache.spark.sql.SparkSession

    object 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(" "))
    }
    }
  6. JAR ファイルをビルドするには、次のコマンドを実行します。

    Bash
    sbt assembly

    コンパイルされた JAR ファイルは、 target/フォルダーにmy-spark-app-assembly-0.1.0-SNAPSHOT.jarとして作成されます。

依存関係の管理

サーバレス コンピュート上のJARでライブラリを利用できるようにするには:

  • 提供されたライブラリを使用する : サーバーレス コンピュートには、 Databricks Connectと厳選された共通ライブラリのセットが含まれています。 お使いのバージョンが互換性がある場合は、ビルド時にprovidedと宣言し、JAR ファイルには含めないでください。
  • 環境ライブラリとしてアタッチ : ライブラリがまだ提供されていない場合は、サーバレス環境にライブラリを追加します。 実行時のみに必要となるライブラリで、含めたくないものに使用してください。
  • 外部データベースへの接続 : JDBCの場合、ドライバを含める代わりにJDBC接続を使用します。 JDBC接続はUnityカタログによって管理されます。認証情報、リネージ、ガバナンスはすべて自動的に処理されます。

提供ライブラリ

以下のライブラリは必須の依存関係であり、サーバレス コンピュート上で無償で入手できます。 ビルド時にそれらをprovided宣言してください。これらのライブラリの独自のバージョンをバンドルすると、ランタイム時にNoSuchMethodErrorがトリガーされます。

注記

以下に示すライブラリのバージョンは 、サーバレス環境バージョン 4 用です。他の環境バージョンでインストールされているライブラリについては、サーバレス環境バージョンのメモのリファレンスを参照してください。

  • com.databricks:databricks-connect_2.13バージョン17.3.2
  • org.scala-lang:scala-library_2.13バージョン2.13.16
  • org.scala-lang:scala-reflect_2.13バージョン2.13.16
  • org.slf4j:slf4j-apiバージョン2.0.10
  • org.apache.logging.log4j:log4j-apiバージョン2.20.0
  • org.apache.logging.log4j:log4j-coreバージョン2.20.0
  • org.apache.httpcomponents:httpclientバージョン4.5.14
  • org.apache.httpcomponents:httpcoreバージョン4.4.16
  • com.fasterxml.jackson.core:jackson-databindバージョン2.15.2
  • com.fasterxml.jackson.core:jackson-coreバージョン2.15.2
  • com.fasterxml.jackson.core:jackson-annotationsバージョン2.15.2
  • com.fasterxml.jackson.datatype:jackson-datatype-jsr310バージョン2.15.2
  • com.google.guava:guavaバージョン 32.0.1-jre
  • commons-io:commons-ioバージョン2.14.0
  • org.json4s:json4s-jackson_2.13バージョン4.0.7
  • org.apache.commons:commons-lang3バージョン3.14.0
  • org.apache.commons:commons-configuration2バージョン2.11.0
  • org.apache.commons:commons-textバージョン1.12.0
  • com.databricks:databricks-sdk-javaバージョン0.52.0
  • com.databricks:databricks-dbutils-scala_2.13バージョン0.1.4

ステップ 2: JARを実行するジョブを作成する

  1. ワークスペースで、サイドバーの ワークフローアイコン。 ジョブ & パイプライン をクリックします。

  2. 作成 をクリックし、 ジョブ をクリックします。

  3. 最初のタスクを構成するには、 JAR タイルをクリックします。 JAR タイルが利用できない場合は、 「別のタスク タイプを追加」 をクリックし、 JAR を検索します。

  4. オプションで、ジョブの名前 (デフォルトは New Job <date-time> ) をジョブ名に置き換えます。

  5. タスク に、タスクの名前を入力します (例: JAR_example)。

  6. 必要に応じて、「 タイプ 」ドロップダウン・メニューから「 JAR 」を選択します。

  7. メインクラス には、JAR のパッケージとクラスを入力します。前の例に従った場合は、 com.examples.SparkJarと入力します。

  8. コンピュート の場合は、 「サーバレス」 を選択します。

  9. サーバーレス環境を構成します。

    1. 環境を選択し、クリックします鉛筆アイコン。設定するには 編集してください
    2. 環境バージョン として 4 以上を選択します。
    3. JARファイルをファイルセレクターにドラッグアンドドロップして追加するか、 Unity Catalogボリュームまたはワークスペースの場所から参照して選択します。
  10. この例では、 パラメーター["Hello", "World!"]と入力します。

  11. タスクを作成 」をクリックします。

ステップ 3: ジョブを実行し、ジョブ実行の詳細を表示します

「今すぐ実行」ボタンをクリックしてワークフローを実行します。 実行の詳細 を表示するには、 トリガーされた実行 ポップアップで 実行の表示 をクリックするか、ジョブの実行ビューで実行の 開始時刻 列のリンクをクリックします。

実行が完了すると、 出力 ペインに、タスクに渡した引数を含む出力が表示されます。

トラブルシューティング

以下の表は、よくある例外に関するトラブルシューティング情報を示しています。

例外

原因

修正

NoSuchMethodError scala.*クラスを参照しています

Scala 2.12 に対してコンパイルされたJAR 。 サーバレス実行Scala 2.13

scalaVersion := "2.13.16"で再コンパイルしてください。すべてのScala依存関係に_2.13クロスバージョンサフィックスが使用されていることを確認してください。

NoClassDefFoundError: scala/...

Scala 2.12と2.13の不一致

scalaVersion := "2.13.16"で再コンパイルしてください。すべてのScala依存関係に_2.13クロスバージョンサフィックスが使用されていることを確認してください。

UnsupportedClassVersionError (クラスファイルのバージョンが61より高い場合)

JDK 18 以降でコンパイルされています。 サーバレス実行 JDK 17

<maven.compiler.release>17</maven.compiler.release> (Maven) または--release 17 (sbt / javac) を使用してください。

NoClassDefFoundError: org/apache/spark/... 内部パッケージの場合( catalystutilsql/utilsql/internalapi/java 、またはrdd

Sparkの内部機能またはRDD APIが使用されました。これらは、 レスでは入手できません。

パブリックSpark API ( DataFrame /データセット/ SQL ) を使用します。サーバレスの制限事項を参照してください。

ClassNotFoundException JDBCドライバクラスの場合(例: oracle.jdbc.OracleDriver

JDBCドライバがクラスパス上にありません

外部データベースにはJDBC接続を使用してください。

ClassNotFoundException サードパーティクラスの場合(例: kotlin.jvm.internal.*

ライブラリはサーバレス クラスパス上にありません。

JARに追加するか、または、品質レス環境を使用して追加のJARとして提供します。

UnsatisfiedLinkError 以下のファイルを参照する /tmp/

JARファイルに含まれるネイティブライブラリ

ネイティブライブラリはサーバレスではサポートされていません。 Pure Java の同等のもの、または従来のコンピュートでの実行を使用します。

NoSuchMethodError サードパーティライブラリ(Apache Commons、Guava、Jacksonなど)から

同梱されているバージョンは、提供されているバージョンと競合します。

提供されているバージョンを使用してください。ビルド時にprovidedとマークして、JARファイルに含めないようにしてください。

次のステップ