通过ADF执行Databricks Notebook访问存储遇配置初始化错误求助
ADF调用Databricks Notebook访问ADLS时的权限错误问题
我正在使用Azure Data Factory(ADF)中的notebook任务执行Databricks作业,此前的copy活动已成功将数据写入存储,但在Databricks中尝试读取该数据时出现以下错误:
Py4JJavaError: An error occurred while calling o393.load. : Failure to initialize configuration for storage account $DATALAKENAME.dfs.core.windows.net: Invalid configuration value detected for fs.azure.account.keyInvalid configuration value detected for fs.azure.account.key at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.services.SimpleKeyProvider.getStorageAccountKey(SimpleKeyProvider.java:52) at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.AbfsConfiguration.getStorageAccountKey(AbfsConfiguration.java:715) at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.initializeClient(AzureBlobFileSystemStore.java:2084) at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.(AzureBlobFileSystemStore.java:272) ...
已完成的配置步骤:
- 通过Databricks访问连接器在Unity Catalog(UC)中定义了存储凭据
- 针对目标
abfss://文件路径定义了外部位置 - 为我的用户账户和Data Factory托管标识(MSI)授予了外部位置的
READ FILES和WRITE FILES权限 - 为Databricks访问连接器授予了存储账户的
Storage Blob Data Contributor角色 - 为Data Factory授予了Databricks工作区的
Contributor角色
关键场景:在用户上下文下交互式运行Notebook时可正常读取数据,仅通过ADF执行时出现错误,确认通过访问连接器/外部位置的存储身份验证逻辑是有效的。我不想启用基于访问密钥的存储账户身份验证作为临时解决方法。
解决方案
1. 确保ADF调用Databricks作业时使用Unity Catalog身份
在ADF的Notebook任务配置中:
- 启用使用Unity Catalog选项
- 确认作业运行身份指定为Data Factory的MSI,或作业关联的集群已配置为使用UC身份验证
2. 检查Databricks集群配置
- 集群必须启用Unity Catalog,避免在集群配置(如Spark配置)中硬编码存储账户的访问密钥(该配置会覆盖UC的身份验证逻辑)
- 确保集群的运行策略允许访问目标外部位置
3. 验证ADF MSI的UC权限生效
在Databricks SQL中执行以下命令,确认ADF的MSI已被正确授予外部位置权限:
SHOW GRANTS ON EXTERNAL LOCATION <your_external_location_name>;
确保输出中包含ADF MSI的READ FILES和WRITE FILES权限记录
4. 使用外部位置别名访问数据
在Notebook中,优先通过外部位置名称而非直接的abfss路径访问数据,例如:
# 推荐方式:使用外部位置别名 df = spark.read.parquet("external_location:/your/data/path") # 避免直接使用abfss路径 # df = spark.read.parquet("abfss://container@$DATALAKENAME.dfs.core.windows.net/your/data/path")
这种方式会强制触发Unity Catalog的身份验证流程,避免使用访问密钥的逻辑被误触发
内容的提问来源于stack exchange,提问作者Joe Plumb
相关产品推荐
相关产品推荐

