概要
Databricks にて外部から REST API により Lakeflow ジョブを実行する手順を紹介します。 Databricks Free Edition での手順となっているため、多くの方に検証していただける手順にしています。
REST API 絡みの関連ドキュメントは下記です。
- サービスプリンシパルへのアクセスをOAuthでDatabricksに許可する | Databricks on AWS
- Trigger a new job run | Jobs API | REST API reference | Databricks on AWS
- Get a single job run | Jobs API | REST API reference | Databricks on AWS
- Get the output for a single run | Jobs (legacy) API | REST API reference | Databricks on AWS
事前準備
Databricks Free Edition の申し込み
出所: Sign up for Databricks Free Edition - Databricks
Databricks Workspace の URL を取得
Databricks Workspace にアクセスし、 URL を控えます。
ノートブックを作成
+ 新規 -> ワークスペース -> ノートブックを選択しノード数を作成後、ノートブックの名称を変更します。
コードを記述します。
dbutils.widgets.text("parameter_01", "None")
print(dbutils.widgets.get("parameter_01"))
dbutils.notebook.exit("処理完了")
Lakeflow Job に追加
ノートブックの右上にあるスケジュールを選択し、Createを選択します。
作成したスケジュールのケバブメニューからView in Jobsを選択します。
ジョブの画面に移動することを確認します。
右側にあるスケジュールとトリガー領域にて削除を選択します。
ジョブの手動実行
今すぐ実行を選択します。
正常終了することを確認します。
サービスプリンシパルの取得
右上のユーザーロゴ -> 設定を選択します。
IDとアクセス -> サービスプリンシパルの管理を選択します。
Service Principalを追加を選択します。
新規追加を選択します。
サービスプリンシパル名を入力して、追加を選択します。
作成したサービスプリンシパルを選択します。
シークレットタブを選択し、シークレットを作成を選択します。
存続期間(日)に1と入力し、生成を選択します。
表示された値を控えます。
サービスプリンシパルに対するジョブの実行権限を付与
ジョブの画面を表示します。
右下にある権限領域の権限を編集を選択します。
作成したサービスプリンシパル名を入力し、追加を選択します
Saveを選択します。
Job の情報を取得
ジョブの画面を表示します。
ジョブ ID の値を取得します。
REST API の実行
変数のセット
Databricks の URL、 サービスプリンシパルの ID、 サービスプリンシパルのシークレット、および、ジョブ ID を変数にセットします。
export DATABRICKS_HOST="https://dbc-xxxxxx.cloud.databricks.com"
export CLIENT_ID="<service-principal-client-id>"
export CLIENT_SECRET="<service-principal-oauth-secret>"
export JOB_ID="1045956103223040"
トークンの取得
OAUTH_TOKEN=$(
curl --silent --request POST \
--url "${DATABRICKS_HOST}/oidc/v1/token" \
--user "${CLIENT_ID}:${CLIENT_SECRET}" \
--data 'grant_type=client_credentials&scope=all-apis' \
| jq -r '.access_token'
)
echo "$OAUTH_TOKEN" | cut -c1-20
eyJraWQiOiI2NDZiZWZk
ジョブの実行
RUN_ID=$(
jq -n \
--argjson job_id "$JOB_ID" \
'{
job_id: $job_id,
notebook_params: {
parameter_01: "sample_value_001"
}
}' \
| curl --silent --request POST \
"${DATABRICKS_HOST}/api/2.2/jobs/run-now" \
--header "Authorization: Bearer ${OAUTH_TOKEN}" \
--header "Content-Type: application/json" \
--data @- \
| jq -r '.run_id'
)
echo "RUN_ID=${RUN_ID}"
RUN_ID=357305013688600
ジョブの実行完了確認
while true; do
RESP=$(
curl --silent --get \
"${DATABRICKS_HOST}/api/2.0/jobs/runs/get" \
--header "Authorization: Bearer ${OAUTH_TOKEN}" \
--data-urlencode "run_id=${RUN_ID}"
)
LIFE=$(echo "$RESP" | jq -r '.state.life_cycle_state')
RESULT=$(echo "$RESP" | jq -r '.state.result_state // empty')
MSG=$(echo "$RESP" | jq -r '.state.state_message // empty')
echo "life_cycle_state=${LIFE} result_state=${RESULT} message=${MSG}"
case "$LIFE" in
TERMINATED|INTERNAL_ERROR|SKIPPED)
break
;;
esac
sleep 10
done
life_cycle_state=TERMINATED result_state=SUCCESS message=
ジョブの出力結果を取得
curl --silent --get \
"${DATABRICKS_HOST}/api/2.0/jobs/runs/get-output" \
--header "Authorization: Bearer ${OAUTH_TOKEN}" \
--data-urlencode "run_id=${RUN_ID}" \
| jq -r '.notebook_output'
{
"result": "処理完了",
"truncated": false
}































