在无服务器计算中创建并运行 Scala 和 Java JAR

重要

无服务器 Scala 和 Java 作业处于 Beta 阶段。 可以使用 JAR 任务来部署 JAR 文件。 如果尚未启用,请参阅管理 Azure Databricks 预览

Java 存档 (JAR) 将 Java 或 Scala 代码打包到单个文件中。 本文介绍如何使用 Spark 代码创建 JAR,并将其部署为 无服务器计算上的 Lakeflow 作业。

小窍门

对于自动化部署和持续集成工作流,使用 Databricks Asset Bundles(资产捆绑包)利用带有预配置构建和部署设置的模板创建项目。 请参阅使用 Databricks Asset Bundles 构建 Scala JAR将 JAR 文件上传到 Unity Catalog 的捆绑包。 本文描述了用于部署的手动方法,或通过使用无服务器计算环境来了解 JAR 的工作原理。

要求

本地开发环境必须具有以下条件:

  • sbt 1.11.7 或更高版本(对于 Scala JAR)
  • Maven 3.9.0 或更高版本(适用于 Java JAR)
  • 与无服务器环境匹配的 JDK、Scala 和 Databricks Connect 版本(此示例使用 JDK 17、Scala 2.13.16 和 Databricks Connect 17.0.1)

步骤 1. 生成 JAR

Scala

  1. 运行以下命令以创建新的 Scala 项目:

    sbt new scala/scala-seed.g8
    

    出现提示时,输入项目名称,例如 my-spark-app

  2. 将你的 build.sbt 文件的内容替换为下面的内容:

    scalaVersion := "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"
    
  3. 编辑或创建 project/assembly.sbt 文件,并添加以下行:

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1")
    
  4. src/main/scala/example/DatabricksExample.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(" "))
      }
    }
    
  5. 若要生成 JAR 文件,请运行以下命令:

    sbt assembly
    

Java

  1. 运行以下命令以创建新的 Maven 项目结构:

    # Create all directories at once
    mkdir -p my-spark-app/src/main/java/com/examples
    
    cd my-spark-app
    
  2. 在项目根目录中创建一个pom.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.0
             http://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.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <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.0.1</version>
        </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>
    
  3. src/main/java/com/examples/SparkJar.java中创建主类:

    package 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(" "))
        );
      }
    }
    
  4. 若要生成 JAR 文件,请运行以下命令:

    mvn clean package
    

    编译的 JAR 位于target/目录中,名为my-spark-app-1.0-SNAPSHOT.jar

步骤 2. 创建用于运行 JAR 的作业

  1. 在工作区中,单击工作流图标,然后在边栏中选择作业和管道

  2. 单击创建,然后选择作业

    任务 ”选项卡显示空任务窗格。

    注意

    如果 Lakeflow 作业 UION,请单击 JAR 磁贴以配置第一个任务。 如果 JAR 磁贴不可用,请单击“ 添加其他任务类型 ”并搜索 JAR

  3. (可选)将默认为 New Job <date-time>作业名称的作业名称替换为作业名称。

  4. 任务名称中,输入任务的名称,例如 JAR_example

  5. 如有必要,请从“类型”下拉菜单中选择 JAR

  6. 对于 Main 类,请输入 Jar 的包和类。 如果遵循上述示例,请输入 com.examples.SparkJar

  7. 对于 “计算”,请选择“ 无服务器”。

  8. 配置无服务器环境:

    1. 选择环境,然后单击 铅笔图标。编辑 以对其进行配置。
    2. 环境版本选择 4-scala-preview
    3. 通过将 JAR 文件拖放到文件选择器,或浏览以从 Unity 目录卷或工作区位置选择它来添加 JAR 文件。
  9. 对于此示例,请输入 作为“参数”。["Hello", "World!"]

  10. 单击“创建任务”。

步骤 3:运行作业并查看作业运行详细信息

单击 立即运行按钮 以运行工作流。 若要查看运行详细信息,请在“已触发的运行”弹出窗口中单击“查看运行”,或者在作业运行视图中单击运行“开始时间”列中的链接。

运行完成后,输出会显示在“输出”面板中,其中包括传递给任务的参数。

后续步骤