Azure存储容器通过SAS令牌连接Spark/Databricks失败(403错误)
Spark访问Azure存储容器JSON文件时403认证错误排查方案
问题场景
我尝试通过Spark访问Azure存储容器中的JSON数据文件,已按如下方式配置Spark:
spark.conf.set(f"fs.azure.account.auth.type.{STORAGE_ACCOUNT_NAME}.dfs.core.windows.net", "SAS") spark.conf.set(f"fs.azure.sas.token.provider.type.{STORAGE_ACCOUNT_NAME}.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider") spark.conf.set(f"fs.azure.sas.fixed.token.{STORAGE_ACCOUNT_NAME}.dfs.core.windows.net", SAS_TOKEN) logging.info('spark was configured')
执行data = get_data_from_file(BLOB_PATH)进行连接时,出现403认证错误:
"Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature."
已知信息:
- SAS令牌与文件路径均正确;
- 容器网络设置启用了防火墙,禁用后问题仍存在;
- 访问其他存储账户可正常工作,未修改特殊配置。
排查步骤
- 校验SAS令牌格式:确认SAS_TOKEN是否包含开头的
?,若有需删除。Spark配置中不需要该前缀,带?会导致签名拼接错误。例如原令牌为?sv=xxxx&ss=xxxx...,需改为sv=xxxx&ss=xxxx...。 - 匹配存储账户URL后缀:检查存储账户类型与配置后缀是否一致:
- 若为ADLS Gen2,路径需用
abfss://<container>@<account>.dfs.core.windows.net/<path>,配置后缀保持dfs.core.windows.net; - 若为标准Blob存储,配置后缀需改为
blob.core.windows.net,路径用wasbs://<container>@<account>.blob.core.windows.net/<path>。不匹配会导致认证方式失效。
- 若为ADLS Gen2,路径需用
- 验证SAS令牌权限与资源类型:检查SAS令牌是否包含读取权限(
r),资源类型是否覆盖目标对象(o)或容器(c)。可通过Azure Storage Explorer直接使用该SAS令牌访问目标JSON文件,确认权限有效性。 - 检查Spark/Hadoop版本兼容性:旧版本Hadoop Azure客户端(低于3.2版本)对ADLS Gen2的SAS认证存在bug,会导致签名生成错误。升级Hadoop版本至3.2及以上,或确认客户端依赖包完整性。
- 同步集群系统时间:Azure存储签名验证要求客户端与服务器时间偏差不超过15分钟,若Spark集群系统时间与UTC时间偏差过大,会触发403错误。检查并同步集群节点时间至UTC标准时间。
- 确认配置作用域:确保Spark配置在创建DataFrame前设置,且当前会话已加载配置。可在配置后执行
print(spark.conf.get("fs.azure.sas.fixed.token.<account>.dfs.core.windows.net")),验证令牌是否正确加载。
内容的提问来源于stack exchange,提问作者Solomon Shubaev
相关产品推荐
相关产品推荐

