Azure Function调用Databricks Python Notebook相关技术咨询
1. Azure Function是否支持运行基于PySpark开发的Databricks Notebook
完全支持,但要注意运行逻辑:Azure Function不会直接在自身运行沙箱内执行PySpark代码——PySpark分布式计算需要专属的集群计算资源,Function本身的轻量运行环境不具备这个能力,实际落地是把Azure Function作为调度触发端,通过调用Databricks原生的作业运行接口触发Notebook在你指定的Databricks集群上运行,原有Notebook的聚合计算逻辑不需要做核心改造。
2. 是否支持将Azure Function HTTP触发器接收的参数传递给Notebook,附具体实现方案
支持,全流程不需要额外的第三方组件,实现步骤如下:
- 前置权限配置:在Databricks工作区生成具备作业提交、作业状态查询权限的个人访问令牌,把令牌存在Azure Function的应用配置项中,不要硬编码在Function代码里,遵循最小权限原则即可。
- Notebook侧改造:在你现有Notebook的最开头,通过Databricks widgets声明需要接收的参数,示例代码如下:
# 声明接收的参数,三个入参分别是参数名、默认值、参数展示名 dbutils.widgets.text("stat_date", "2024-01-01", "聚合统计日期") dbutils.widgets.text("agg_dimension", "region", "聚合维度") # 读取传入的参数值,后续计算逻辑直接用这两个变量即可 stat_date = dbutils.widgets.get("stat_date") agg_dimension = dbutils.widgets.get("agg_dimension")
- Function侧参数透传:HTTP触发器收到请求后,先做基础的参数合法性校验,将需要透传的参数整理为字符串类型的键值对(Databricks notebook参数默认只接收字符串类型值,数值、布尔类型可以先转成字符串传入,Notebook内部再做类型转换),构造作业提交请求体时把参数塞入
notebook_task下的base_parameters字段,示例代码片段如下:
# Azure Function中构造Databricks作业提交请求体的示例 import os import requests # 从应用配置读取Databricks访问令牌和工作区地址 db_token = os.getenv("DATABRICKS_TOKEN") db_host = os.getenv("DATABRICKS_HOST") job_submit_url = f"{db_host}/api/2.1/jobs/runs/submit" headers = {"Authorization": f"Bearer {db_token}"} # 从HTTP请求中读取参数 req_params = req.params payload = { "run_name": "func-triggered-agg-job", "existing_cluster_id": "你的Databricks集群ID", "notebook_task": { "notebook_path": "你的Notebook在Databricks工作区的绝对路径", "base_parameters": { "stat_date": req_params.get("stat_date"), "agg_dimension": req_params.get("agg_dimension") } } } # 提交作业,拿到返回的run_id用于后续查询结果 submit_resp = requests.post(job_submit_url, headers=headers, json=payload) run_id = submit_resp.json()["run_id"]
3. 是否可通过HTTP触发器将Databricks Notebook的运行输出回传给Azure Function
支持,根据输出结果的体量选择对应实现方式即可:
- 小体量结果场景(单份结果大小在5MB以内,比如聚合后的指标值、统计汇总结果):直接在Notebook计算逻辑的最后,调用
dbutils.notebook.exit(结果内容)把结果作为作业退出值返回即可。Azure Function提交作业后,可轮询作业运行状态,当作业状态变为SUCCESS时,调用作业结果查询接口,即可从返回体中拿到Notebook通过exit传出的结果,将结果包装为HTTP响应返回给调用方即可。 - 大体量结果场景(结果大小超过5MB,比如明细级聚合结果、批量导出数据):不要直接通过作业接口传结果,让Notebook把计算结果写入指定的存储路径(比如ADLS Gen2的对应容器目录),最后把结果的存储路径、文件数量、数据量这些元信息通过
dbutils.notebook.exit()返回给Function,Function再把这些元信息返回给调用方,由调用方自行到存储路径读取完整结果,避免接口超长报错、请求超时。
注意事项:如果你的聚合任务运行时间普遍超过5分钟,不建议用Function同步等待结果再返回的模式,容易触发Function的超时限制,可以改成异步逻辑:Function提交作业后直接把run_id返回给调用方,调用方后续凭run_id自行查询作业状态和结果即可。
内容的提问来源于stack exchange,提问作者SanjanaSanju
相关产品推荐
相关产品推荐

