DevOps流水线调度Databricks Notebook成功,但另一Notebook单次运行失败求助
问题分析与解决
你的问题出在**jobs/run-now API的参数使用错误**:这个接口的作用是触发已存在的Databricks Job,而非直接传入创建Job的配置。你给body2的结构是创建Job的格式,不符合run-now的要求,导致调用失败。
解决方案:两种可行方式
方式1:先创建notebook2的Job,再触发单次运行
如果需要保留notebook2的Job定义(方便后续再次触发),可以先调用jobs/create创建Job,拿到job_id后再调用run-now:
- task: Bash@3 displayName: 'Schedule Databricks Notebook' inputs: targetType: 'inline' script: | set -x databricksUrl='https://adb-13946046.6.azuredatabricks.net/api/2.0' notebookPath1='/Users/user/notebook1.py' notebookPath2='/Users/user/notebook2.py' jobName='ScheduledJobName1' jobName2='testjob' requestUri="$databricksUrl/jobs/create" requestUriRun="$databricksUrl/jobs/run-now" # 创建notebook1的定时Job body='{ "name": "'$jobName'", "new_cluster": { "spark_version": "7.0.x", "node_type_id": "Standard_DS3_v2", "num_workers": 0 }, "notebook_task": { "notebook_path": "'$notebookPath1'" }, "schedule": { "quartz_cron_expression": "45 10 * * * ?", "timezone_id": "Canada/Eastern" } }' # 创建notebook2的Job(无定时) body2='{ "name": "'$jobName2'", "new_cluster": { "spark_version": "7.0.x", "node_type_id": "Standard_DS3_v2", "num_workers": 0 }, "notebook_task": { "notebook_path": "'$notebookPath2'" } }' # 创建notebook1的定时Job curl -X POST -H "Authorization: Bearer $(token)" -H "Content-Type: application/json" -d "$body" "$requestUri" # 创建notebook2的Job并提取job_id job2_id=$(curl -X POST -H "Authorization: Bearer $(token)" -H "Content-Type: application/json" -d "$body2" "$requestUri" | jq -r '.job_id') # 触发notebook2的单次运行 curl -X POST -H "Authorization: Bearer $(token)" -H "Content-Type: application/json" -d '{"job_id": '$job2_id'}' "$requestUriRun"
方式2:直接提交单次运行(无需预创建Job)
如果不需要保留notebook2的Job定义,推荐使用jobs/runs/submit接口,直接提交单次运行任务:
- task: Bash@3 displayName: 'Schedule Databricks Notebook' inputs: targetType: 'inline' script: | set -x databricksUrl='https://adb-13946046.6.azuredatabricks.net/api/2.0' notebookPath1='/Users/user/notebook1.py' notebookPath2='/Users/user/notebook2.py' jobName='ScheduledJobName1' requestUri="$databricksUrl/jobs/create" requestUriSubmit="$databricksUrl/jobs/runs/submit" # 创建notebook1的定时Job body='{ "name": "'$jobName'", "new_cluster": { "spark_version": "7.0.x", "node_type_id": "Standard_DS3_v2", "num_workers": 0 }, "notebook_task": { "notebook_path": "'$notebookPath1'" }, "schedule": { "quartz_cron_expression": "45 10 * * * ?", "timezone_id": "Canada/Eastern" } }' # 提交notebook2的单次运行 body2='{ "new_cluster": { "spark_version": "7.0.x", "node_type_id": "Standard_DS3_v2", "num_workers": 0 }, "notebook_task": { "notebook_path": "'$notebookPath2'" } }' # 执行API请求 curl -X POST -H "Authorization: Bearer $(token)" -H "Content-Type: application/json" -d "$body" "$requestUri" curl -X POST -H "Authorization: Bearer $(token)" -H "Content-Type: application/json" -d "$body2" "$requestUriSubmit"
调试补充
- 脚本开头添加
set -x可开启调试模式,查看curl命令的实际执行参数和返回结果 - 确认
$(token)拥有jobs/create、jobs/runs/submit(或jobs/run-now)的权限 - 可在本地测试curl命令,验证API调用是否正常
内容的提问来源于stack exchange,提问作者Vin
相关产品推荐
相关产品推荐

