Spark Submit タスクの非推奨通知と移行ガイド
Spark Submit タスクは非推奨となっており、削除待ちの状態です。このタスク タイプの使用は新しいユースケースでは禁止されており、既存の顧客には強くお勧めしません。このタスク タイプの元のドキュメントについては、Spark Submit (legacy)をご覧ください。引き続き移行手順をご確認ください。
Spark Submitが非推奨である理由
[Spark Submit] タスクの種類は、JAR 、ノートブック 、またはPython スクリプト のタスクにはない技術的な制限と機能のギャップがあるため、非推奨になっています。これらのタスクは、Databricks の機能との統合を強化し、パフォーマンスを向上させ、信頼性を高めます。
非推奨措置
Databricks は非推奨化に伴い、以下の対策を実施しています。
- **作成の制限**: 2025 年 11 月以降の過去 1 か月間に **Spark Submit** タスクを使用したユーザーのみが、新しい **Spark Submit** タスクを作成できます。例外が必要な場合は、アカウントサポートにお問い合わせください。
- Databricks Runtime のバージョンに関する制限事項 : Spark Submit の使用は、既存の Databricks Runtime バージョンおよびメンテナンス リリースに制限されます。 **Spark Submit** を使用している既存の Databricks Runtime バージョンは、この機能が完全にシャットダウンされるまで、セキュリティおよびバグ修正のメンテナンスリリースを引き続き受け取ります。Databricks Runtime 17.3 以降および 18.x 以降は、このタスクタイプをサポートしていません。
- **UI警告**: **Spark Submit**タスクが使用されている場合、Databricks UI全体に警告が表示され、既存ユーザーのアカウントのワークスペース管理者に通知が送信されます。
JVMワークロードをJARタスクに移行する
JVMワークロードの場合、 Spark Submit タスクをJARタスクに移行してください。JARタスクは、より優れた機能サポートとDatabricksとの統合を提供します。
移行するには、次のステップに従ってください:
- ジョブで新しいJARタスクを作成します。
- Spark Submit タスクのパラメーターから、最初の 3 つの引数を特定します。 一般的には次のパターンに従います。
["--class", "org.apache.spark.mainClassName", "dbfs:/path/to/jar_file.jar"] --classパラメーターを削除します。- JAR タスクの メインクラス として、メインクラス名(例えば、
org.apache.spark.mainClassName)を設定します。 - JAR タスク構成で JAR ファイルへのパス (たとえば、
dbfs:/path/to/jar_file.jar) を指定します。 - 「**Spark Submit**」タスクから残りの引数をJARタスクパラメーターにコピーします。
- JARタスクを実行し、期待どおりに動作することを確認します。
JARタスクの設定に関する詳細については、「JARタスク」を参照してください。
Rワークロードを移行する
[Spark Submit] タスクから直接 R スクリプトを起動する場合、複数の移行パスがあります。
オプションA:ノートブックタスクを使用する
R スクリプトを Databricks ノートブックに移行します。ノートブック タスクは、クラスターオートスケーリングを含むすべての機能をサポートし、Databricks プラットフォームとのより良い統合を提供します。
オプションB:ノートブックタスクからRスクリプトをブートストラップする
ノートブックタスクを使用して 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 Submitタスクを含むワークスペース内のジョブを特定できます。有効な個人用アクセストークンまたはその他のトークンが必要となり、ワークスペースのURLを使用します。
オプション A: 高速スキャン(最初にこれを実行してください。永続的なジョブのみ対象)
このスクリプトは、永続的なジョブ(/jobs/create または Web インターフェース経由で作成された)のみをスキャンし、/runs/submit 経由で作成された一時的なジョブは含まれません。これは、Spark Submit の使用状況を特定する上で推奨される最初の手法です。なぜなら、はるかに高速であるためです。
#!/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()
オプションB:包括的なスキャン(低速、過去30日間のエフェメラルジョブを含む)
/runs/submitを介して作成されたエフェメラルジョブを特定する必要がある場合は、このより詳細なスクリプトを使用してください。このスクリプトは、ワークスペース内の過去 30 日間のすべてのジョブ実行をスキャンします。これには、永続ジョブ(/jobs/createを介して作成されたもの)とエフェメラルジョブの両方が含まれます。大規模なワークスペースでは、このスクリプトの実行に数時間かかる場合があります。
#!/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()
ヘルプが必要ですか?
さらにサポートが必要な場合は、アカウントサポートにお問い合わせください。