You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark使用SAS令牌访问带专用端点的Blob存储时提示存储账户不允许公共访问

Apache Spark通过SAS令牌访问带专用端点的Blob存储失败问题

问题描述

无法通过Apache Spark访问带有专用端点的Blob存储,报错信息如下:

org.apache.hadoop.fs.azure.AzureException: com.microsoft.azure.storage.StorageException:
Public access is not permitted on this storage account.

使用Access Keys可正常访问,但SAS令牌访问失败。已按文档配置以下参数:

sparkSession.conf().set(
  "fs.azure.sas.<CONTAINER_NAME>.<STORAGE_ACCOUNT>.blob.core.windows.net", 
  <BASE-64_ENCODED_SASTOKEN>)

也尝试过以下配置,仍报相同的“存储账户不允许公共访问”错误:

sparkSession.sparkContext().conf().set(
  "fs.azure.sas.<CONTAINER_NAME>.<STORAGE_ACCOUNT>.blob.core.windows.net", 
  <BASE-64_ENCODED_SASTOKEN>)

注:SAS令牌下Spark访问Blob存储专用端点存在问题,但公共访问时可正常工作。

问题原因分析

使用专用端点时,Spark的Azure存储驱动可能仍尝试通过公共端点访问存储账户;若SAS令牌针对专用端点生成,或存储账户强制专用端点访问,就会触发公共访问被禁止的错误。此外,SAS令牌的格式、权限范围,以及Hadoop配置是否正确指定专用端点也可能是诱因。

解决步骤

1. 修正SAS令牌格式

Hadoop Azure驱动接受原始SAS字符串(格式为?sv=xxxx&ss=xxxx&srt=xxxx...),不需要进行Base64编码,直接使用生成的原始SAS令牌即可。

2. 配置Spark强制使用专用端点

在Spark配置中添加参数,强制驱动通过专用端点访问存储:

// Blob存储专用端点配置
sparkSession.conf().set("fs.azure.account.endpoint.<STORAGE_ACCOUNT>.blob.core.windows.net", "<STORAGE_ACCOUNT>.privatelink.blob.core.windows.net");

// 若为ADLS Gen2,额外添加以下配置
sparkSession.conf().set("fs.azure.account.endpoint.<STORAGE_ACCOUNT>.dfs.core.windows.net", "<STORAGE_ACCOUNT>.privatelink.dfs.core.windows.net");

3. 检查SAS令牌权限与范围

  • 确认SAS令牌包含所需操作权限(如r读、w写、l列出等),且有效期未过期。
  • 若使用容器级SAS,确保令牌针对目标容器生成;若使用账户级SAS,配置键需改为fs.azure.sas.<STORAGE_ACCOUNT>.blob.core.windows.net,无需包含容器名。

4. 验证Hadoop版本兼容性

确保使用的Hadoop Azure存储驱动版本与Spark版本兼容,建议使用Hadoop 3.3.x及以上版本,旧版本对专用端点支持可能不完善。

5. 检查虚拟网络与专用端点配置

  • 确认Spark集群所在虚拟网络已与存储账户专用端点建立连接,且NSG允许集群到专用端点的流量。
  • 若Spark运行在Azure托管服务(如HDInsight)上,需确保存储账户“防火墙和虚拟网络”设置中勾选了“允许受信任的Microsoft服务访问此存储账户”。

内容的提问来源于stack exchange,提问作者Bhavani Sankar Patnam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:40:10