Pular para o conteúdo principal

Aviso de descontinuação e guia de migração da tarefa Spark Submit

atenção

A tarefa **Spark Submit** está obsoleta e com remoção pendente. O uso deste tipo de tarefa não é permitido para novos casos de uso e é fortemente desencorajado para clientes existentes. Consulte Spark Submit (legado) para a documentação original deste tipo de tarefa. Continue lendo para obter instruções de migração.

Por que o envio do Spark está obsoleto​

O tipo de tarefa Spark Submit está sendo descontinuado devido a limitações técnicas e lacunas de recursos que não existem nas tarefas JAR, Notebook ou de script Python. Essas tarefas oferecem melhor integração com os recursos do Databricks, desempenho aprimorado e maior confiabilidade.

Medidas de descontinuação​

A Databricks está implementando as seguintes medidas em conexão com a descontinuação:

  • Criação restrita : somente usuários que usaram tarefas do Spark Submit no mês anterior, a partir de novembro de 2025, podem criar novas tarefas do Spark Submit . Se precisar de uma exceção, entre em contato com o suporte da sua conta.
  • Restrições de versão do Databricks Runtime : O uso do Spark Submit é restrito a versões existentes do Databricks Runtime e a versões de manutenção. Versões existentes do Databricks Runtime com **Spark Submit** continuam a receber atualizações de manutenção de segurança e correção de bugs até que o recurso seja completamente desativado. O Databricks Runtime 17.3+ e 18.x+ não oferece suporte a este tipo de tarefa.
  • Avisos da IU : Avisos aparecem em toda a IU do Databricks onde as tarefas Spark Submit estão em uso, e as comunicações são enviadas aos administradores de workspace nas accounts de usuários existentes.

Migrar workloads JVM para tarefas JAR​

Para workloads JVM, migre suas tarefas **Spark Submit** para tarefas JAR. As tarefas JAR fornecem melhor suporte a recursos e integração com o Databricks.

Siga os passos para migrar:

  1. Crie uma nova tarefa JAR em seu Job.
  2. Nos parâmetros da tarefa de **Spark Submit**, identifique os três primeiros argumentos. Eles geralmente seguem este padrão: ["--class", "org.apache.spark.mainClassName", "dbfs:/path/to/jar_file.jar"]
  3. Remova o parâmetro --class.
  4. Defina o nome da classe principal (por exemplo,)org.apache.spark.mainClassName como a **classe principal** para sua tarefa JAR.
  5. Forneça o caminho para seu arquivo JAR (por exemplo, dbfs:/path/to/jar_file.jar) na configuração da tarefa JAR.
  6. Copie todos os argumentos restantes da sua tarefa **Spark Submit** para os parâmetros da tarefa JAR.
  7. Execute a tarefa JAR e verifique se ela funciona como esperado.

Para informações detalhadas sobre a configuração de tarefas JAR, consulte tarefa JAR.

Migrar cargas de trabalho R​

Se você estiver executando um script R diretamente de uma tarefa Spark Submit , vários caminhos de migração estarão disponíveis.

Opção A: usar tarefas de Notebook​

Migre seu script R para um Notebook Databricks. As tarefas de Notebook suportam um conjunto completo de recursos, incluindo autoscale de clusters, e fornecem melhor integração com a plataforma Databricks.

Opção B: Inicializar scripts R de uma tarefa de Notebook​

Use uma tarefa de Notebook para inicializar seus scripts R. Crie um notebook com o código a seguir e referencie seu arquivo R como um parâmetro do job. Modifique para adicionar parâmetros usados pelo seu script R, se necessário:

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

Encontrar Jobs que usam tarefas do Spark Submit​

Você pode usar os seguintes scripts Python para identificar Jobs em seu workspace que contêm tarefas do Spark Submit. Será necessário um access token pessoal válido ou outro token, e a URL do seu workspace deve ser usada.

Opção A: Fast Scan (execute este primeiro, apenas para Jobs persistentes)​

Este script verifica apenas Jobs persistentes (criados via /jobs/create ou pela interface da web) e não inclui Jobs efêmeros criados via /runs/submit. Este é o método de primeira linha recomendado para identificar o uso do Spark Submit porque é muito mais rápido.

Python
#!/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: Verificação abrangente (mais lenta, inclui jobs efêmeros dos últimos 30 dias)​

Se você precisa identificar jobs efêmeros criados via /runs/submit, use este script mais exaustivo. Este script verifica todas as execuções de jobs dos últimos 30 dias em seu workspace, incluindo jobs persistentes (criados via /jobs/create) e jobs efêmeros. Este script pode levar horas para sua execução em workspaces grandes.

Python
#!/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()

Precisa de ajuda?​

Se precisar de ajuda adicional, entre em contato com o suporte da sua account.