Azure Databricks无凭据传递时,服务主体创建带ADLS位置Schema报错求助
问题分析
错误的核心原因是Hive元存储在访问ADLS时,未使用你配置的服务主体OAuth认证,而是默认尝试读取未设置的fs.azure.account.key密钥认证,导致初始化失败。具体细节:
- 你在Notebook中设置的
spark.conf仅作用于当前Spark会话的作业执行,但Hive元存储在注册Schema/表元数据时,会读取Hadoop级别的全局配置,而非仅Spark会话配置,导致元存储无法获取OAuth参数,触发密钥缺失错误。 - 启用凭据传递后Schema创建成功,是因为元存储使用了你的用户凭据,但写表时Spark作业仍尝试加载服务主体配置,或存在配置冲突,导致认证逻辑混乱。
解决方案
方案1:集群级配置服务主体认证(推荐)
将服务主体的OAuth认证配置添加到集群的Spark配置中,确保Hive元存储和所有Spark会话都能继承正确的认证参数:
- 进入Azure Databricks控制台,打开你的LTS 13.3集群页面,点击编辑。
- 在Spark配置文本框中添加以下内容(替换占位符为你的实际值):
fs.azure.account.auth.type.MyStorageAcct.dfs.core.windows.net OAuth fs.azure.account.oauth.provider.type.MyStorageAcct.dfs.core.windows.net org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider fs.azure.account.oauth2.client.id.MyStorageAcct.dfs.core.windows.net <你的服务主体Client ID> fs.azure.account.oauth2.client.secret.MyStorageAcct.dfs.core.windows.net <你的服务主体Client Secret> fs.azure.account.oauth2.client.endpoint.MyStorageAcct.dfs.core.windows.net https://login.microsoftonline.com/<你的租户ID>/oauth2/token
- 重启集群使配置生效,之后无需在Notebook中重复设置
spark.conf,直接执行创建Schema和写表代码即可。
方案2:Notebook会话级传递Hadoop配置(临时解决)
如果无法修改集群配置,可通过spark.hadoop前缀设置Hadoop级别的认证参数,让Hive元存储能读取到OAuth配置:
# 设置Hadoop全局级别的ADLS OAuth认证 spark.conf.set("spark.hadoop.fs.azure.account.auth.type.MyStorageAcct.dfs.core.windows.net", "OAuth") spark.conf.set("spark.hadoop.fs.azure.account.oauth.provider.type.MyStorageAcct.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") spark.conf.set("spark.hadoop.fs.azure.account.oauth2.client.id.MyStorageAcct.dfs.core.windows.net", "relevant_vals") spark.conf.set("spark.hadoop.fs.azure.account.oauth2.client.secret.MyStorageAcct.dfs.core.windows.net", "relevant_vals") spark.conf.set("spark.hadoop.fs.azure.account.oauth2.client.endpoint.MyStorageAcct.dfs.core.windows.net", "https://login.microsoftonline.com/relevant_vals/oauth2/token")
之后执行创建Schema的SQL:
CREATE SCHEMA my_new_schema LOCATION "abfss://testingcontainer@MyStorageAcct.dfs.core.windows.net/my_new_schema.db"
以及写表代码:
df.write.format('delta')\ .mode("overwrite")\ .option("path","abfss://testingcontainer@MyStorageAcct.dfs.core.windows.net/my_new_schema.db/table_test_copy_v20240307.delta")\ .saveAsTable('my_new_schema.table_test_copy_v20240307')
额外检查项
- 确认服务主体对目标ADLS容器拥有Storage Blob Data Contributor权限,或至少具备创建目录、写入文件的权限。
- 避免混合使用凭据传递和服务主体认证,选择一种统一的认证方式,防止配置冲突。
内容的提问来源于stack exchange,提问作者kpython
相关产品推荐
相关产品推荐

