Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Avvertimento
L'attività Spark Submit è deprecata e verrà presto rimossa. L'utilizzo di questo tipo di attività non è consentito per i nuovi casi d'uso e sconsigliato per i clienti esistenti. Per la documentazione originale per questo tipo di attività, vedere Spark Submit (legacy). Continuare a leggere per istruzioni sulla migrazione.
Perché Spark Submit è deprecato?
Il tipo di attività Spark Submit è deprecato a causa di limitazioni tecniche e lacune di funzionalità che non si trovano nelle attività di JAR, Notebook o script Python. Queste attività offrono una migliore integrazione con le funzionalità di Databricks, prestazioni migliorate e maggiore affidabilità.
Misure di deprecazione
Databricks implementa le misure seguenti in relazione alla deprecazione:
- Creazione con restrizioni: solo gli utenti che hanno usato attività di invio Spark nel mese precedente, a partire da novembre 2025, possono creare nuove attività di invio spark . Se hai bisogno di un'eccezione, contatta l'assistenza clienti.
- Restrizioni della versione di Databricks Runtime: l'utilizzo dell'invio di Spark è limitato alle versioni esistenti di Databricks Runtime e alle versioni di manutenzione esistenti. Le versioni esistenti di Databricks Runtime con Spark Submit continueranno a ricevere versioni di manutenzione di sicurezza e correzione di bug fino a quando la funzionalità non viene arrestata completamente. Databricks Runtime 17.3+ e 18.x+ non supporterà questo tipo di attività.
- Avvisi dell'interfaccia utente: gli avvisi vengono visualizzati nell'interfaccia utente di Databricks in cui sono in uso le attività di invio spark e le comunicazioni vengono inviate agli amministratori dell'area di lavoro in account di utenti esistenti.
Eseguire la migrazione dei carichi di lavoro JVM alle attività JAR
Per i carichi di lavoro JVM, migrare le attività Spark Submit alle attività JAR. Le attività JAR offrono un supporto e un'integrazione migliori delle funzionalità con Databricks.
Seguire questa procedura per eseguire la migrazione:
- Creare una nuova attività JAR nel tuo lavoro.
- Dai parametri dell'attività Spark Submit identificare i primi tre argomenti. In genere seguono questo modello:
["--class", "org.apache.spark.mainClassName", "dbfs:/path/to/jar_file.jar"] - Rimuovere il
--classparametro . - Impostare il nome della classe principale (ad esempio,
org.apache.spark.mainClassName) come classe Main per l'attività JAR. - Specifica il percorso del file JAR (ad esempio,
dbfs:/path/to/jar_file.jar) nella configurazione dell'attività JAR. - Copiare gli argomenti rimanenti dall'attività Invia Spark ai parametri dell'attività JAR.
- Eseguire l'attività JAR e verificare che funzioni come previsto.
Per informazioni dettagliate sulla configurazione delle attività JAR, vedere Attività JAR.
Eseguire la migrazione di carichi di lavoro R
Se si avvia uno script R direttamente da un'attività di invio Spark , sono disponibili più percorsi di migrazione.
Opzione A: Usare le attività del notebook
Eseguire la migrazione dello script R a un notebook di Databricks. Le attività notebook supportano un set completo di funzionalità, tra cui la scalabilità automatica dei cluster e offrono una migliore integrazione con la piattaforma Databricks.
Opzione B: Script R bootstrap da un'attività del Notebook
Usare un'attività Notebook per eseguire il bootstrap degli script R. Creare un notebook con il codice seguente e fare riferimento al file R come parametro del processo. Modificare per aggiungere parametri usati dallo script R, se necessario:
dbutils.widgets.text("script_path", "", "Path to script")
script_path <- dbutils.widgets.get("script_path")
source(script_path)
Trova lavori che utilizzano attività di Spark Submit
È possibile usare gli script Python seguenti per identificare i processi nell'area di lavoro che contengono attività di invio Spark. Sarà necessario un accesso personale valido o un altro token e sarà necessario usare l'URL dell'area di lavoro .
Opzione A: Analisi veloce (esegui per primo questo, solo incarichi persistenti)
Questo script analizza solo i processi persistenti (creati tramite /jobs/create o l'interfaccia Web) e non include processi temporanei creati tramite /runs/submit. Si tratta del metodo di prima riga consigliato per identificare l'utilizzo di Spark Submit perché è molto più veloce.
#!/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()
Opzione B: Scansione completa (più lentamente, include attività effimere degli ultimi 30 giorni)
Se è necessario identificare i processi effimeri creati tramite /runs/submit, usare questo script più completo. Questo script analizza tutte le esecuzioni dei processi degli ultimi 30 giorni nell'area di lavoro, inclusi i processi permanenti (creati tramite /jobs/create) e i processi temporanei. L'esecuzione di questo script può richiedere ore in aree di lavoro di grandi dimensioni.
#!/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()
Hai bisogno di aiuto?
Se è necessaria assistenza aggiuntiva, contattare il supporto dell'account.