Databricksのジョブ管理はUIでの手動操作でも可能ですが、本番環境での運用やCI/CDパイプラインの構築には Jobs APIの理解が不可欠です。この記事では、Jobs API 2.1のエンドポイント構成、リクエスト例、 ジョブ定義のJSON構造、認証方式、そしてRuns APIによる実行監視までを体系的に整理します。
Jobs API 2.1で利用する主要エンドポイントを以下に整理します。 すべてのエンドポイントのベースURLは https://<workspace-url>/api/2.1/jobs/ です。
| 操作 | メソッド | エンドポイント | 用途 |
|---|---|---|---|
| ジョブ作成 | POST | /api/2.1/jobs/create | 新規ジョブの定義と登録 |
| ジョブ一覧 | GET | /api/2.1/jobs/list | ワークスペース内の全ジョブ取得 |
| ジョブ詳細 | GET | /api/2.1/jobs/get?job_id={id} | 特定ジョブの定義と状態取得 |
| 即時実行 | POST | /api/2.1/jobs/run-now | 既存ジョブのトリガー実行 |
| ジョブ更新 | POST | /api/2.1/jobs/reset | ジョブ定義の完全上書き |
| 部分更新 | POST | /api/2.1/jobs/update | ジョブ定義の一部フィールドのみ変更 |
| ジョブ削除 | POST | /api/2.1/jobs/delete | ジョブの完全削除 |
| 実行一覧 | GET | /api/2.1/jobs/runs/list | ジョブの実行履歴取得 |
| 実行詳細 | GET | /api/2.1/jobs/runs/get?run_id={id} | 特定Runの状態・結果取得 |
| 実行キャンセル | POST | /api/2.1/jobs/runs/cancel | 実行中Runの停止 |
resetはジョブ定義全体を置き換える(指定しなかったフィールドはデフォルトに戻る)のに対し、updateは指定したフィールドだけを変更します。CI/CDでは定義全体をコードで管理するためresetが多用されます。
以下はPATを使ってジョブを作成し、実行するcurl例です。
# ジョブ作成
curl -X POST \
https://adb-1234567890.12.azuredatabricks.net/api/2.1/jobs/create \
-H "Authorization: Bearer dapi_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "daily_etl_pipeline",
"tasks": [{
"task_key": "ingest",
"notebook_task": {
"notebook_path": "/Repos/prod/etl/ingest"
},
"new_cluster": {
"spark_version": "14.3.x-scala2.12",
"node_type_id": "i3.xlarge",
"num_workers": 4
}
}]
}'
# ジョブ実行(run-now)
curl -X POST \
https://adb-1234567890.12.azuredatabricks.net/api/2.1/jobs/run-now \
-H "Authorization: Bearer dapi_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"job_id": 12345}'requestsライブラリを使った同等の処理です。本番ではエラーハンドリングとリトライを追加します。
import requests
WORKSPACE_URL = "https://adb-1234567890.12.azuredatabricks.net"
TOKEN = "dapi_xxxxxxxxxxxx"
HEADERS = {"Authorization": f"Bearer {TOKEN}"}
# ジョブ作成
job_config = {
"name": "daily_etl_pipeline",
"tasks": [{
"task_key": "ingest",
"notebook_task": {"notebook_path": "/Repos/prod/etl/ingest"},
"new_cluster": {
"spark_version": "14.3.x-scala2.12",
"node_type_id": "i3.xlarge",
"num_workers": 4
}
}]
}
resp = requests.post(
f"{WORKSPACE_URL}/api/2.1/jobs/create",
headers=HEADERS, json=job_config
)
job_id = resp.json()["job_id"]
# 即時実行
run_resp = requests.post(
f"{WORKSPACE_URL}/api/2.1/jobs/run-now",
headers=HEADERS, json={"job_id": job_id}
)
run_id = run_resp.json()["run_id"]
# 実行結果のポーリング
import time
while True:
status = requests.get(
f"{WORKSPACE_URL}/api/2.1/jobs/runs/get",
headers=HEADERS, params={"run_id": run_id}
).json()
life_cycle = status["state"]["life_cycle_state"]
if life_cycle in ("TERMINATED", "INTERNAL_ERROR", "SKIPPED"):
break
time.sleep(30)Jobs API 2.1の最大の特徴はマルチタスクジョブです。複数のタスクを1つのジョブ内に定義し、depends_onで依存関係を宣言的に記述できます。
{
"name": "daily_pipeline",
"schedule": {
"quartz_cron_expression": "0 0 6 * * ?",
"timezone_id": "Asia/Tokyo"
},
"tasks": [
{
"task_key": "extract",
"notebook_task": {"notebook_path": "/Repos/prod/etl/extract"},
"new_cluster": { ... }
},
{
"task_key": "transform",
"depends_on": [{"task_key": "extract"}],
"notebook_task": {"notebook_path": "/Repos/prod/etl/transform"},
"new_cluster": { ... }
},
{
"task_key": "load",
"depends_on": [{"task_key": "transform"}],
"notebook_task": {"notebook_path": "/Repos/prod/etl/load"},
"new_cluster": { ... }
}
],
"email_notifications": {
"on_failure": ["[email protected]"]
},
"max_concurrent_runs": 1
}max_concurrent_runsを1にすると、前回のRunが完了するまで次のRunは開始されません。 スケジュール起動とrun-now APIの競合を防ぐために、本番ジョブでは1に設定するのが一般的です。
run-now APIでジョブを実行する際に、パラメータを動的に渡すことができます。 ノートブックタスクではbase_parameters(ジョブ定義側のデフォルト)とnotebook_params(run-now側の上書き)で値を受け渡します。
# run-nowでパラメータ上書き
curl -X POST .../api/2.1/jobs/run-now \
-d '{
"job_id": 12345,
"notebook_params": {
"target_date": "2026-03-27",
"mode": "full_refresh"
}
}'ノートブック内ではdbutils.widgets.get("target_date")でパラメータを取得します。 Pythonタスクではpython_params、SparkSubmitタスクではspark_submit_paramsを使います。
ジョブの実行結果を確認するにはRuns APIを使います。重要なフィールドは以下の通りです。
| フィールド | 値の例 | 意味 |
|---|---|---|
| life_cycle_state | PENDING / RUNNING / TERMINATED | Runのライフサイクル段階 |
| result_state | SUCCESS / FAILED / TIMEDOUT / CANCELED | 完了時の結果(TERMINATED時のみ) |
| state_message | "Cluster is starting..." | 現在の状態メッセージ |
| start_time | 1711526400000 | 開始時刻(ミリ秒エポック) |
| end_time | 1711530000000 | 終了時刻(ミリ秒エポック) |
| 認証方式 | 用途 | 有効期限 | 推奨シナリオ |
|---|---|---|---|
| PAT(Personal Access Token) | 個人の開発・テスト | 手動設定(最大365日) | ローカル開発、一時的なスクリプト |
| OAuth M2M(Service Principal) | CI/CD・自動化 | 自動ローテーション | GitHub Actions、Azure DevOps等のパイプライン |
| Azure AAD Token | Azure統合 | 短期(1時間) | Azureマネージド環境からの呼び出し |
Data Engineer Professional
問題 1
あるデータエンジニアリングチームが、GitHub ActionsからDatabricks Jobs APIを使ってジョブを自動デプロイ・実行するCI/CDパイプラインを構築している。メンバーの退職時にAPIアクセスが失効するリスクを排除したい。最も適切な認証方式はどれか。
正解: B
Service PrincipalによるOAuth M2M認証は、特定のユーザーに紐づかないため退職・異動の影響を受けません。PATの共有はセキュリティリスクが高く、Basic認証はDatabricksでサポートされていません。個人PATの個別登録は退職時にトークン無効化が必要で運用負荷が増大します。
Jobs API 2.0と2.1の違いは何ですか?
Jobs API 2.1ではマルチタスクジョブ(1つのジョブ定義に複数タスクを含めて依存関係を定義できる)がサポートされました。2.0では1ジョブ=1タスクの構造でしたが、2.1ではtasksフィールドに複数タスクを配列で定義し、depends_onで実行順序を制御できます。新規開発では2.1の利用が推奨されています。
Jobs APIでジョブを作成する場合、PATとOAuth M2Mのどちらを使うべきですか?
CI/CDパイプラインや自動化スクリプトではOAuth M2M(Machine-to-Machine)認証が推奨されます。PATは有効期限管理が必要で、ユーザーに紐づくため退職・異動時のリスクがあります。OAuth M2MはService Principalに紐づき、トークンの自動ローテーションが可能なため、本番運用ではM2Mが適切です。
Jobs APIで作成したジョブとUI上で作成したジョブに機能差はありますか?
機能差はありません。UI上で作成したジョブもAPIで取得・編集・実行が可能です。逆にAPIで作成したジョブもUI上で確認・手動実行できます。ただし、CI/CDで管理する場合はAPIまたはDatabricks Asset Bundles(DABs)経由で作成し、UI上での手動変更を禁止する運用が推奨されます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Databricks資格一覧|全7試験・難易度・勉強法
Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...
Databricks試験の難易度ランキング|全7資格を徹底比較
Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...
Databricks資格の勉強方法|最短合格ルートと学習時間の目安
Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...
Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略
Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...
Databricks Data Engineer Professional完全解説|上級試験の攻略法
Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...