Spark 提交任务弃用通知和迁移指南

警告

Spark Submit任务已弃用并即将被移除。 对于新用例,不允许使用此任务类型,强烈建议不要对现有客户使用。 有关此任务类型的原始文档,请参阅 Spark Submit(旧 版)。 继续阅读迁移说明。

为什么 Spark Submit 已弃用?

由于 JARNotebookPython 脚本任务中不存在的技术限制和功能差距,Spark 提交任务类型已被弃用。 这些任务提供与 Databricks 功能更好的集成、改进的性能和可靠性。

弃用措施

Databricks 正在实施与即将淘汰相关的以下措施:

  • 受限创建:仅从 2025 年 11 月开始使用 Spark 提交 任务的用户才能创建新的 Spark 提交 任务。 如果您需要特殊豁免,请联系您的账户支持。
  • API 弃用通知:尝试创建或编辑 Spark 提交 任务的 API 请求可能会被随机拒绝,以处理弃用通知。 重试具有相同参数的请求,直到它们成功。
  • DBR 版本限制Spark 提交 使用仅限于现有 DBR 版本和维护版本。 使用 Spark Submit 的现有 DBR 版本将继续接收安全和 bugfix 维护版本,直到功能完全关闭。 DBR 17.3+ 和 18.x+ 不支持此任务类型。
  • UI 警告:整个 Databricks UI 中会出现警告,当 Spark 提交 任务在使用时,通信将发送给属于现有用户帐户的工作区管理员。

将 JVM 工作负荷迁移到 JAR 任务

对于 JVM 工作负荷,请将 Spark 提交 任务迁移到 JAR 任务。 JAR 任务提供更好的功能支持和与 Databricks 的集成。

按照以下步骤迁移:

  1. 在作业中创建新的 JAR 任务。
  2. Spark 提交 任务参数中,标识前三个参数。 它们通常遵循以下模式: ["--class", "org.apache.spark.mainClassName", "dbfs:/path/to/jar_file.jar"]
  3. 删除--class参数。
  4. 将主类名称(例如) org.apache.spark.mainClassName设置为 JAR 任务的 Main 类
  5. 在 JAR 任务配置中提供 JAR 文件的路径(例如 dbfs:/path/to/jar_file.jar)。
  6. Spark 提交 任务中的任何剩余参数复制到 JAR 任务参数。
  7. 运行 JAR 任务并验证它是否按预期工作。

有关配置 JAR 任务的详细信息,请参阅 JAR 任务

迁移 R 工作负荷

如果要直接从 Spark 提交 任务启动 R 脚本,则可以使用多个迁移路径。

选项 A:使用笔记本任务

将 R 脚本迁移到 Databricks 笔记本。 笔记本任务支持一组完整的功能,包括群集自动缩放,并更好地与 Databricks 平台集成。

选项 B:从笔记本任务启动 R 脚本

使用 Notebook 任务启动 R 脚本。 使用以下代码创建笔记本,并将 R 文件引用为作业参数。 根据需要修改以添加 R 脚本使用的参数:

dbutils.widgets.text("script_path", "", "Path to script")
script_path <- dbutils.widgets.get("script_path")
source(script_path)

查找使用 Spark Submit 任务的作业

您可以使用以下 Python 脚本来识别工作区中您可查看的包含 Spark 提交任务的所有作业。 这有助于清点受影响的作业并规划迁移。 需要有效的 个人访问或其他令牌 ,并且应使用 工作区 URL

#!/usr/bin/env python3
"""
Requirements:
    databricks-sdk>=0.20.0

Usage:
    export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com"
    export DATABRICKS_TOKEN="your-token"
    python list_spark_submit_jobs.py

Output:
    CSV format with columns: Job ID, Owner ID/Email, Job Name

Incorrect:
    export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com/?o=12345678910"
"""

import csv
import os
import sys
from databricks.sdk import WorkspaceClient

def main():
    # Get credentials from environment
    workspace_url = os.environ.get("DATABRICKS_HOST")
    token = os.environ.get("DATABRICKS_TOKEN")

    if not workspace_url or not token:
        print("Error: Set DATABRICKS_HOST and DATABRICKS_TOKEN environment variables", file=sys.stderr)
        sys.exit(1)

    # Initialize client
    client = WorkspaceClient(host=workspace_url, token=token)

    # Scan workspace for jobs with Spark Submit tasks
    print("Scanning workspace for jobs with Spark Submit tasks... (this will take a while)", file=sys.stderr)
    jobs_with_spark_submit = []
    total_jobs = 0

    for job in client.jobs.list(expand_tasks=True):
        total_jobs += 1

        # Check if job has any Spark Submit tasks
        if job.settings and job.settings.tasks:
            has_spark_submit = any(
                task.spark_submit_task is not None
                for task in job.settings.tasks
            )

            if has_spark_submit:
                job_name = job.settings.name or f"Unnamed Job {job.job_id}"
                owner_email = job.creator_user_name or "Unknown"
                jobs_with_spark_submit.append({
                    'job_id': job.job_id,
                    'owner_email': owner_email,
                    'job_name': job_name
                })

    # Print summary to stderr
    print(f"Scanned {total_jobs} jobs total", file=sys.stderr)
    print(f"Found {len(jobs_with_spark_submit)} jobs with Spark Submit tasks", file=sys.stderr)
    print("", file=sys.stderr)

    # Output CSV to stdout
    if jobs_with_spark_submit:
        writer = csv.DictWriter(
            sys.stdout,
            fieldnames=['job_id', 'owner_email', 'job_name'],
            quoting=csv.QUOTE_MINIMAL
        )
        writer.writeheader()
        writer.writerows(jobs_with_spark_submit)
    else:
        print("No jobs with Spark Submit tasks found.", file=sys.stderr)

if __name__ == "__main__":
    main()

需要帮助?

如果需要其他帮助,请联系帐户支持人员。