Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Warnung
Die Spark Submit-Aufgabe ist veraltet und wird demnächst entfernt. Die Verwendung dieses Vorgangstyps ist für neue Anwendungsfälle unzulässig und wird für bestehende Kunden dringend abgeraten. Die Originaldokumentation für diesen Aufgabentyp finden Sie unter Spark Submit (Legacy). Lesen Sie weiter, um Migrationsanweisungen zu erhalten.
Warum ist Spark Submit veraltet?
Der Spark Submit-Aufgabentyp wird aufgrund technischer Einschränkungen und Featurelücken, die nicht in den JAR, Notebook oder Python-Skript-Aufgaben enthalten sind, abgekündigt. Diese Aufgaben bieten eine bessere Integration in Databricks-Features, verbesserte Leistung und höhere Zuverlässigkeit.
Abschaffungsmaßnahmen
Databricks implementiert die folgenden Maßnahmen im Zusammenhang mit der Deaktivierung:
- Eingeschränkte Erstellung: Ab November 2025 können nur Benutzer, die Spark Submit-Aufgaben im vorherigen Monat verwendet haben, neue Spark Submit-Aufgaben erstellen. Wenn Sie eine Ausnahme benötigen, wenden Sie sich an den Kontosupport.
- Einschränkungen der Databricks-Runtime-Version: Spark Submit-Nutzung ist auf vorhandene Databricks-Runtime-Versionen und Wartungsversionen beschränkt. Vorhandene Databricks-Runtime-Versionen mit Spark Submit erhalten weiterhin Sicherheits- und Bugfix-Wartungsversionen, bis das Feature vollständig beendet wird. Databricks Runtime 17.3+ und 18.x+ unterstützen diesen Aufgabentyp nicht.
- Benutzeroberflächenwarnungen: Warnungen werden auf der Benutzeroberfläche von Databricks angezeigt, auf der Spark Submit-Aufgaben verwendet werden, und die Kommunikation wird an Arbeitsbereichsadministratoren in Konten vorhandener Benutzer gesendet.
Migrieren von JVM-Workloads zu JAR-Aufgaben
Migrieren Sie für JVM-Workloads Ihre Spark Submit-Aufgaben zu JAR-Aufgaben. JAR-Aufgaben bieten eine bessere Featureunterstützung und Integration für Databricks.
Führen Sie die folgenden Schritte zum Migrieren aus:
- Erstellen Sie eine neue JAR-Aufgabe in Ihrem Auftrag.
- Identifizieren Sie aus den Spark Submit-Vorgangsparametern die ersten drei Argumente. Sie folgen in der Regel diesem Muster:
["--class", "org.apache.spark.mainClassName", "dbfs:/path/to/jar_file.jar"] - Entfernen Sie den
--classParameter. - Legen Sie den Hauptklassennamen (z. B
org.apache.spark.mainClassName. ) als Hauptklasse für Ihre JAR-Aufgabe fest. - Geben Sie den Pfad zu Ihrer JAR-Datei (z. B
dbfs:/path/to/jar_file.jar. ) in der JAR-Aufgabenkonfiguration an. - Kopieren Sie alle verbleibenden Argumente aus ihrem Spark Submit-Vorgang in die JAR-Vorgangsparameter.
- Führen Sie die JAR-Aufgabe aus, und überprüfen Sie, ob sie wie erwartet funktioniert.
Ausführliche Informationen zum Konfigurieren von JAR-Aufgaben finden Sie unter JAR-Aufgabe.
Migrieren von R-Workloads
Wenn Sie ein R-Skript direkt aus einer Spark Submit-Aufgabe starten, stehen mehrere Migrationspfade zur Verfügung.
Option A: Verwenden von Notizbuchaufgaben
Migrieren Sie Ihr R-Skript zu einem Databricks-Notizbuch. Notebook-Aufgaben unterstützen eine vollständige Reihe von Funktionen, einschließlich automatischer Skalierung des Clusters, und bieten eine bessere Integration mit der Databricks-Plattform.
Option B: Bootstrap R-Skripts aus einer Notizbuchaufgabe
Verwenden Sie eine Notizbuchaufgabe , um Ihre R-Skripts zu bootstrapieren. Erstellen Sie ein Notizbuch mit dem folgenden Code, und verweisen Sie als Auftragsparameter auf Ihre R-Datei. Ändern Sie, um parameter hinzuzufügen, die von Ihrem R-Skript verwendet werden, falls erforderlich:
dbutils.widgets.text("script_path", "", "Path to script")
script_path <- dbutils.widgets.get("script_path")
source(script_path)
Suchen von Aufträgen, die Spark Submit-Aufgaben verwenden
Sie können die folgenden Python-Skripts verwenden, um Aufträge in Ihrem Arbeitsbereich zu identifizieren, die Spark Submit-Aufgaben enthalten. Ein gültiger persönlicher Zugriff oder ein anderes Token wird benötigt, und Ihre Arbeitsbereichs-URL sollte verwendet werden.
Option A: Schnelle Überprüfung (führen Sie diese zuerst aus, nur für dauerhafte Aufträge)
Dieses Skript überprüft nur persistente Aufträge (erstellt über /jobs/create oder die Webschnittstelle) und schließt keine ephemeren Aufträge ein, die über /runs/submit erstellt wurden. Dies ist die empfohlene First-Line-Methode zum Identifizieren der Spark Submit-Verwendung, da sie viel schneller ist.
#!/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"
python3 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
from databricks.sdk.errors import PermissionDenied
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 persistent jobs with Spark Submit tasks
# Using list() to scan only persistent jobs (faster than list_runs())
print(
"Scanning workspace for persistent jobs with Spark Submit tasks...",
file=sys.stderr,
)
jobs_with_spark_submit = []
total_jobs = 0
# Iterate through all jobs (pagination is handled automatically by the SDK)
skipped_jobs = 0
for job in client.jobs.list(expand_tasks=True, limit=25):
try:
total_jobs += 1
if total_jobs % 1000 == 0:
print(f"Scanned {total_jobs} jobs total", file=sys.stderr)
# 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:
# Extract job information
job_id = job.job_id
owner_email = job.creator_user_name or "Unknown"
job_name = job.settings.name or f"Job {job_id}"
jobs_with_spark_submit.append(
{"job_id": job_id, "owner_email": owner_email, "job_name": job_name}
)
except PermissionDenied:
# Skip jobs that the user doesn't have permission to access
skipped_jobs += 1
continue
# Print summary to stderr
print(f"Scanned {total_jobs} jobs total", file=sys.stderr)
if skipped_jobs > 0:
print(
f"Skipped {skipped_jobs} jobs due to insufficient permissions",
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()
Option B: Umfassender Scan (langsamer, umfasst kurzlebige Aufträge aus den letzten 30 Tagen)
Wenn Sie kurzlebige Aufträge identifizieren müssen, die über /runs/submit erstellt wurden, verwenden Sie ein umfassenderes Skript. Dieses Skript überprüft alle Aufträge aus den letzten 30 Tagen in Ihrem Arbeitsbereich, einschließlich persistenter Aufträge (erstellt über /jobs/create) und kurzlebiger Aufträge. Dieses Skript kann Stunden dauern, bis es in großen Arbeitsbereichen ausgeführt wird.
#!/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"
python3 list_spark_submit_runs.py
Output:
CSV format with columns: Job ID, Run ID, Owner ID/Email, Job/Run Name
Incorrect:
export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com/?o=12345678910"
"""
import csv
import os
import sys
import time
from databricks.sdk import WorkspaceClient
from databricks.sdk.errors import PermissionDenied
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)
thirty_days_ago_ms = int((time.time() - 30 * 24 * 60 * 60) * 1000)
# Scan workspace for runs with Spark Submit tasks
# Using list_runs() instead of list() to include ephemeral jobs created via /runs/submit
print(
"Scanning workspace for runs with Spark Submit tasks from the last 30 days... (this will take more than an hour in large workspaces)",
file=sys.stderr,
)
runs_with_spark_submit = []
total_runs = 0
seen_job_ids = set()
# Iterate through all runs (pagination is handled automatically by the SDK)
skipped_runs = 0
for run in client.jobs.list_runs(
expand_tasks=True,
limit=25,
completed_only=True,
start_time_from=thirty_days_ago_ms,
):
try:
total_runs += 1
if total_runs % 1000 == 0:
print(f"Scanned {total_runs} runs total", file=sys.stderr)
# Check if run has any Spark Submit tasks
if run.tasks:
has_spark_submit = any(
task.spark_submit_task is not None for task in run.tasks
)
if has_spark_submit:
# Extract job information from the run
job_id = run.job_id if run.job_id else "N/A"
run_id = run.run_id if run.run_id else "N/A"
owner_email = run.creator_user_name or "Unknown"
# Use run name if available, otherwise try to construct a name
run_name = run.run_name or (
f"Run {run_id}" if run_id != "N/A" else "Unnamed Run"
)
# Track unique job IDs to avoid duplicates for persistent jobs
# (ephemeral jobs may have the same job_id across multiple runs)
key = (job_id, run_id)
if key not in seen_job_ids:
seen_job_ids.add(key)
runs_with_spark_submit.append(
{
"job_id": job_id,
"run_id": run_id,
"owner_email": owner_email,
"job_name": run_name,
}
)
except PermissionDenied:
# Skip runs that the user doesn't have permission to access
skipped_runs += 1
continue
# Print summary to stderr
print(f"Scanned {total_runs} runs total", file=sys.stderr)
if skipped_runs > 0:
print(
f"Skipped {skipped_runs} runs due to insufficient permissions",
file=sys.stderr,
)
print(
f"Found {len(runs_with_spark_submit)} runs with Spark Submit tasks",
file=sys.stderr,
)
print("", file=sys.stderr)
# Output CSV to stdout
if runs_with_spark_submit:
writer = csv.DictWriter(
sys.stdout,
fieldnames=["job_id", "run_id", "owner_email", "job_name"],
quoting=csv.QUOTE_MINIMAL,
)
writer.writeheader()
writer.writerows(runs_with_spark_submit)
else:
print("No runs with Spark Submit tasks found.", file=sys.stderr)
if __name__ == "__main__":
main()
Benötigen Sie Hilfe?
Wenn Sie weitere Hilfe benötigen, wenden Sie sich an den Support Ihres Kontos.