使用databricks-connect调试调用其他notebook的本地Databricks notebook可行性咨询
你本地使用的pyspark.dbutils.DBUtils以及VS Code连接Databricks集群时返回的SparkServiceClientDBUtils,均仅实现了文件系统、密钥管理等基础dbutils功能,notebook模块是Databricks runtime运行环境独有的内置模块,仅在Databricks集群原生运行notebook时才会被加载,本地环境没有对应的实现,因此调用时会抛出属性不存在的异常。
这类调用了其他notebook的Databricks notebook可以本地调试,可根据你的使用场景选择以下方案:
方案1:增加环境分支判断,适配本地执行逻辑
先通过环境变量判断当前运行环境,在Databricks集群上运行时调用dbutils.notebook.run,本地调试时替换为等价执行逻辑,比如将被调用notebook的核心逻辑封装为可导入的Python函数直接调用,或执行对应notebook的代码文件。参考实现如下:import os # 判断是否运行在Databricks官方 runtime 环境 is_databricks = "DATABRICKS_RUNTIME_VERSION" in os.environ if is_databricks: # 集群环境调用原生方法 dbutils.notebook.run("pathofnotebook", timeout_seconds=300) else: # 本地调试逻辑,比如导入被调用notebook封装的方法 from anothernotebook import your_logic your_logic()方案2:使用Databricks官方VS Code扩展远端运行
安装Databricks官方VS Code扩展,绑定你的Azure Databricks工作区和目标集群,将本地notebook的运行模式设置为「在Databricks集群上运行」,该模式下%run、dbutils.notebook.run均可原生支持,无需修改代码即可直接本地调试远端运行的代码。方案3:本地模拟实现
dbutils.notebook模块
你可以自行补全本地dbutils缺失的notebook属性,模拟run方法的行为,比如用nbconvert工具执行本地ipynb文件:from pyspark.dbutils import DBUtils dbutils = DBUtils().get_dbutils(spark) # 本地模拟notebook.run方法 def mock_run(notebook_path, timeout_seconds=300, args=None): import nbformat from nbconvert.preprocessors import ExecutePreprocessor with open(notebook_path, "r", encoding="utf-8") as f: nb = nbformat.read(f, as_version=4) ep = ExecutePreprocessor(timeout=timeout_seconds, kernel_name="python3") ep.preprocess(nb, {"metadata": {"path": "."}}) return "ok" # 给dbutils挂载notebook属性 dbutils.notebook = type("MockNotebook", (), {"run": mock_run})()
内容的提问来源于stack exchange,提问作者Tim

