Azure Databricks作业生成文件检索及权限问题咨询
问题解答
核心问题分析
- 生成的文件会丢失:你当前代码把文件写到了
/databricks/driver/路径下,这是作业运行时driver节点的本地文件系统。作业执行完成后,driver节点会被自动销毁,这些文件也会随之消失,不会被保存到关联的存储账户中。 - 存储账户job容器访问被拒是正常设计:Azure Databricks工作区关联的存储账户中,
job容器属于Databricks服务托管的内部存储,用于存放作业日志、元数据等系统内容。Azure会自动添加拒绝分配(Deny Assignment),即使是组织管理员也无法直接访问,这是为了保护Databricks服务的正常运行,避免用户误操作篡改内部数据。
解决方案:修改代码保存文件到持久化存储
要保留生成的文件,需要将其写入持久化存储,推荐两种方式:
方式1:写入DBFS(Databricks文件系统)
DBFS是Databricks提供的分布式文件系统,数据会持久化存储在工作区关联的存储账户中(对应dbfs容器,而非job容器),作业结束后不会丢失。修改代码如下:
import json # Parse job info info = dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson() info = json.loads(info) RUN_ID = info.get("tags").get("multitaskParentRunId", "no_run_id") # 写入DBFS路径,使用dbfs:/前缀 run_directory = f"/training_runs/{RUN_ID}" dbutils.fs.mkdirs(f"dbfs:{run_directory}") # 通过本地挂载点/dbfs/操作DBFS文件 with open(f"/dbfs{run_directory}/file.txt", "w") as file_: file_.write("Hello world :)")
方式2:写入自己管理的Azure存储账户(Blob/ADLS Gen2)
如果需要更灵活的权限控制,可以将文件写入自己创建的存储账户,避免依赖Databricks托管存储。示例代码(直接使用ABFS路径,需提前配置作业的存储访问权限):
import json # Parse job info info = dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson() info = json.loads(info) RUN_ID = info.get("tags").get("multitaskParentRunId", "no_run_id") # 替换为自己的存储容器和账户名 abfs_path = f"abfss://<容器名>@<存储账户名>.dfs.core.windows.net/training_runs/{RUN_ID}" dbutils.fs.mkdirs(abfs_path) # 写入文件到ABFS路径 with open(f"/dbfs{abfs_path.lstrip('abfss:')}/file.txt", "w") as file_: file_.write("Hello world :)")
如何检索持久化后的文件
- DBFS文件:
- 通过Databricks UI:进入「数据」->「DBFS」,直接浏览下载
- 通过Databricks CLI:使用
databricks fs cp命令将文件下载到本地 - 通过Notebook:用
dbutils.fs.cp命令复制到其他存储位置
- 自己的存储账户文件:
- 使用Azure存储浏览器、Azure CLI或存储SDK直接访问,权限由你自主管理,不会出现拒绝分配的问题
内容的提问来源于stack exchange,提问作者Niels Uitterdijk
相关产品推荐
相关产品推荐

