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
相关产品推荐
相关产品推荐

