Databricks Notebook替代Livy sessions端点及API执行代码相关咨询
问题1:是否可通过Databricks API执行Databricks Notebook内的代码,并将代码输出结果作为响应返回?
可以实现。你可以通过Databricks Jobs API v2.1完成该操作:
- 调用
/api/2.1/jobs/runs/submit端点提交Notebook运行任务,支持指定预先存储的Notebook路径、运行集群、参数等配置 - 任务运行完成后调用
/api/2.1/jobs/runs/get-output端点,即可获取到Notebook所有单元格的执行输出、返回值、错误栈等完整信息,可直接作为响应返回给调用方
如果需要执行动态传入的代码而非固定Notebook内容,也可以配合Repos API临时更新Notebook内容后再提交运行,效果完全一致。
问题2:可行的workaround方案
根据你的使用场景可以选择两种方案:
方案1:固定Notebook执行场景(推荐)
适合需要反复运行已开发完成的Notebook的场景:
- 提前将需要运行的Notebook上传到Databricks工作区或绑定的Git仓库中
- 提交运行请求,示例请求如下:
curl -X POST -n \ https://<你的Databricks实例域名>/api/2.1/jobs/runs/submit \ -d '{ "run_name": "notebook-run-demo", "tasks": [ { "task_key": "demo-task", "existing_cluster_id": "<你的预启动交互式集群ID>", "notebook_task": { "notebook_path": "<Notebook在工作区的路径,比如/Repos/xxx@xxx.com/repo-name/notebook-name>", "base_parameters": {"输入参数名": "参数值"} } } ] }'
- 拿到响应返回的
run_id后轮询/api/2.1/jobs/runs/get接口,直到任务状态变为TERMINATED - 调用
/api/2.1/jobs/runs/get-output接口,提取notebook_output字段即可获得执行结果
如果不需要复用集群,也可以把existing_cluster_id替换为new_cluster配置,每次运行自动创建集群、运行完成后自动销毁。
方案2:动态代码片段执行场景
适合需要类似Livy那样动态提交任意代码的场景:
- 可以将需要执行的代码作为参数传入一个通用的执行Notebook,由Notebook接收参数后动态执行代码再返回结果
- 也可以直接提交
spark_python_task/spark_scala_task/spark_sql_task类型的作业,直接指定要执行的代码内容,不需要提前准备Notebook文件,执行完成后同样可以通过get-output接口拿到结果。
问题3:上述需求是否可通过Databricks SQL API实现
仅纯SQL执行场景可以实现:
- 如果你要执行的所有逻辑都是SQL语句,可以调用Databricks SQL API的
/api/2.0/sql/statements端点提交SQL任务,接口支持同步或异步执行,执行完成后会直接返回结构化的查询结果,无需维护Notebook文件,调用流程更简单。 - 如果你需要执行Python、Scala、R等非SQL的Spark代码,Databricks SQL API不支持该类场景,只能使用前述Jobs API方案实现。
内容的提问来源于stack exchange,提问作者Shad Khan
相关产品推荐
相关产品推荐

