Aviso de descontinuação da tarefa de envio do Spark e guia de migração
A tarefa Spark Submit está obsoleta e aguardando remoção. O uso desse tipo de tarefa não é permitido para novos casos de uso e é fortemente desencorajado para clientes existentes. Consulte Spark Submit (legado) para obter a documentação original deste tipo de tarefa. Continue lendo para obter instruções de migração.
Por que o Spark Submit está sendo descontinuado?
O tipo de tarefa Spark Submit está sendo descontinuado devido a limitações técnicas e lacunas de recursos que não estão na tarefa JAR Python de script, Notebook ou . Essas tarefas oferecem melhor integração com o recurso Databricks , melhor desempenho e maior confiabilidade.
Medidas de depreciação
A Databricks está implementando as seguintes medidas em conexão com a descontinuação:
- Criação restrita : somente usuários que usaram a tarefa Spark Submit no mês anterior, a partir de novembro de 2025, podem criar uma nova tarefa Spark Submit . Se precisar de uma exceção, entre em contato com o suporte da sua account .
- Restrições de versão do DBR : o uso do Spark Submit é restrito às versões existentes do DBR e às versões de manutenção. As versões existentes do DBR com Spark Submit continuarão a receber versões de manutenção de segurança e correção de bugs até que o recurso seja desativado completamente. O DBR 17.3+ e 18.x+ não oferecem suporte a esse tipo de tarefa.
- Avisos da IU : avisos aparecem em toda a IU Databricks onde as tarefas Spark Submit estão em uso, e as comunicações são enviadas aos administradores workspace em conta dos usuários existentes.
Migrar cargas de trabalho JVM para JAR tarefa
Para cargas de trabalho JVM , migre sua tarefa Spark Submit para tarefa JAR . JAR tarefa fornece melhor suporte a recursos e integração com Databricks.
Siga estes passos para migrar:
- Crie uma nova tarefa JAR em seu trabalho.
- Nos parâmetros da tarefa de envio do Spark , identifique os três primeiros argumentos. Eles geralmente seguem este padrão:
["--class", "org.apache.spark.mainClassName", "dbfs:/path/to/jar_file.jar"] - Remova o parâmetro
--class. - Defina o nome da classe principal (por exemplo,
org.apache.spark.mainClassName) como a classe principal para sua tarefa JAR. - Forneça o caminho para o seu arquivo JAR (por exemplo,
dbfs:/path/to/jar_file.jar) na configuração da tarefa JAR. - Copie todos os argumentos restantes da sua tarefa Spark Submit para os parâmetros da tarefa JAR.
- executar a tarefa JAR e verificar se ela funciona conforme o esperado.
Para informações detalhadas sobre a configuração JAR tarefa, consulte JAR tarefa.
Migrar cargas de trabalho R
Se você estiver iniciando um script R diretamente de uma tarefa do Spark Submit , vários caminhos de migração estarão disponíveis.
Opção A: Usar tarefa Notebook
Migre seu script R para um Databricks Notebook. Notebook tarefa oferece suporte a um conjunto completo de recursos, incluindo dimensionamento automático cluster , e fornece melhor integração com a plataforma Databricks .
Opção B: Bootstrap R scripts de uma tarefa do Notebook
Use uma tarefa do Notebook para inicializar seus scripts R. Crie um Notebook com o seguinte código e referencie seu arquivo R como um parâmetro Job. Modifique para adicionar parâmetros usados pelo seu script R, se necessário:
dbutils.widgets.text("script_path", "", "Path to script")
script_path <- dbutils.widgets.get("script_path")
source(script_path)
Encontre trabalhos que utilizem Spark Envie sua tarefa.
Você pode usar os seguintes scripts Python para identificar trabalhos em seu workspace que contenham tarefas de envio Spark . Será necessário um token de acesso pessoal válido ou outro tipo de token , e o URL do seuworkspace deverá ser utilizado.
Opção A: Varredura rápida (execução apenas desta primeira tarefa persistente)
Este script apenas verifica trabalhos persistentes (criados via /jobs/create ou a interface web) e não inclui trabalhos efêmeros criados via /runs/submit. Este é o método inicial recomendado para identificar o uso do Spark Submit, pois é muito mais rápido.
#!/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()
Opção B: Varredura completa (mais lenta, inclui trabalhos temporários dos últimos 30 dias)
Se você precisar identificar trabalhos efêmeros criados via /runs/submit, use este script mais completo. Este script analisa todas as execuções de Job dos últimos 30 dias em seu workspace, incluindo Job persistentes (criados via /jobs/create) e Job efêmeros. Em espaços de trabalho grandes, a execução deste script pode levar horas.
#!/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()
Precisar de ajuda?
Se precisar de ajuda adicional, entre em contato com o suporte da sua account .