如何在Databricks Notebook中调用Cluster API启动集群
返回码127属于shell命令未找到的系统错误,出现该问题的原因是当前运行代码的Databricks集群节点未预装Databricks CLI,因此subprocess调用命令失败。
最优实现方案:直接调用Databricks REST API(无需额外依赖)
这个方案不需要安装任何第三方工具,利用Databricks Runtime默认预装的requests库即可实现,还支持自动等待集群预热完成:
import requests import time # 自动获取当前工作区的API地址和访问令牌,无需硬编码 api_url = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiUrl().get() api_token = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().get() headers = {"Authorization": f"Bearer {api_token}"} # 替换为目标集群ID cluster_id = "XXXX-XXXXXX-XXXXXXX" # 调用启动集群接口 start_resp = requests.post( f"{api_url}/api/2.0/clusters/start", headers=headers, json={"cluster_id": cluster_id} ) start_resp.raise_for_status() print("已触发集群启动,等待预热完成...") # 轮询检查集群状态,直到启动完成 while True: get_resp = requests.get( f"{api_url}/api/2.0/clusters/get", headers=headers, json={"cluster_id": cluster_id} ) get_resp.raise_for_status() cluster_state = get_resp.json()["state"] if cluster_state == "RUNNING": print("集群已完成启动预热,可开始执行数据处理任务") break elif cluster_state in ["TERMINATED", "TERMINATING", "ERROR"]: raise Exception(f"集群启动失败,当前状态:{cluster_state}") # 每30秒查询一次,避免触发API限流 time.sleep(30)
可选方案:使用curl命令调用
如果偏好使用shell命令,可以用notebook的%sh魔法命令结合curl实现:
%sh # 替换为实际的工作区地址、API令牌和集群ID API_URL="https://<你的工作区地址>.azuredatabricks.net" API_TOKEN="<你的API令牌>" CLUSTER_ID="XXXX-XXXXXX-XXXXXXX" # 触发集群启动 curl -X POST \ "${API_URL}/api/2.0/clusters/start" \ -H "Authorization: Bearer ${API_TOKEN}" \ -d '{"cluster_id": "'${CLUSTER_ID}'"}'
注意事项
- 运行上述代码的账号需要对目标集群持有
CAN_MANAGE权限,否则会返回403权限不足错误。 - 上述代码默认操作的是当前工作区的集群,如果需要操作其他工作区的集群,手动替换
api_url和api_token为对应工作区的信息即可。 - 轮询间隔建议不低于10秒,避免触发Databricks API的限流规则。
内容的提问来源于stack exchange,提问作者eqlibrium
相关产品推荐
相关产品推荐

