Databricks Connect远程连接后无法加载Azure存储Avro文件报403错误
403令牌权限不足问题排查与修复
这个报错和Avro文件格式本身无关,核心是远程连接Databricks时使用的身份凭证权限范围未覆盖对应服务端点,按以下顺序排查修复:
- 校验身份令牌的权限范围
代码中直接调用SparkSession.builder.getOrCreate()时,会默认读取本地配置的Databricks PAT令牌或Azure AD令牌,两类令牌的常见问题如下:- 使用Azure AD服务主体令牌的场景:生成令牌时必须同时申请两类权限范围,一是Databricks工作区权限
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default,二是Azure存储访问权限https://storage.azure.com/.default,缺任意一个都会触发该报错 - 使用Databricks个人访问令牌(PAT)的场景:确认令牌未过期,且生成令牌对应的工作区账号不属于只读角色,具备目标Azure存储容器的访问权限
- 使用Azure AD服务主体令牌的场景:生成令牌时必须同时申请两类权限范围,一是Databricks工作区权限
- 校验存储路径与访问配置
代码中azure/storage/containerlocation为简写占位路径,实际使用时注意两点:- 访问ADLS Gen2存储必须使用标准ABFSS协议路径,格式为
abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<文件路径>,不可使用本地文件系统风格的简写路径 - 若目标存储容器未在Databricks工作区做全局挂载,必须在Spark初始化配置中显式传入存储账户的认证信息,不能依赖默认身份传递
- 访问ADLS Gen2存储必须使用标准ABFSS协议路径,格式为
- 排除依赖误导性报错
确认连接的Databricks集群支持Avro读取:Databricks Runtime 8.0及以上版本默认内置Avro模块,若使用低版本Runtime或自定义集群镜像,需手动安装spark-avro依赖,依赖缺失时偶会抛出权限类误导性报错。
修复后可直接运行的代码示例
替换配置项为实际环境参数即可使用:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("fs.azure.account.auth.type.<存储账户名>.dfs.core.windows.net", "OAuth") \ .config("fs.azure.account.oauth.provider.type.<存储账户名>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") \ .config("fs.azure.account.oauth2.client.id.<存储账户名>.dfs.core.windows.net", "<服务主体客户端ID>") \ .config("fs.azure.account.oauth2.client.secret.<存储账户名>.dfs.core.windows.net", "<服务主体客户端密钥>") \ .config("fs.azure.account.oauth2.client.endpoint.<存储账户名>.dfs.core.windows.net", "https://login.microsoftonline.com/<Azure租户ID>/oauth2/token") \ .getOrCreate() df = spark.read.format("avro").load("abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<avro文件路径>") df.show()
前置验证步骤
配置完成后不要直接读文件,先执行两步校验快速定位问题:
- 执行
spark.sql("SHOW CATALOGS").show(),确认Databricks工作区基础连接权限正常 - 执行
dbutils.fs.ls("abfss://<容器名>@<存储账户名>.dfs.core.windows.net/"),确认存储路径访问权限正常
两步校验无报错再执行Avro文件读取,即可排除权限类问题。
内容的提问来源于stack exchange,提问作者Robert Franklin
相关产品推荐
相关产品推荐

