Spark Scala下持存储角色无需SAS token和master key读取Azure Blob Storage数据的方法
Spark Scala无密钥访问Azure Blob Storage方案
核心实现逻辑是通过Azure AD托管身份完成身份校验,不需要明文配置SAS token或存储账户主密钥。
前提条件
- 你使用的Spark运行身份(或Spark集群绑定的托管身份)已经同时满足两类权限配置:
- ARM控制平面权限:你提到的存储账户/容器的Contributor、Reader角色(用于资源访问鉴权)
- 存储数据平面权限:额外分配存储Blob数据读者(只读场景)或存储Blob数据参与者(读写场景)角色,仅ARM角色无法直接访问存储数据
- 若使用自建Spark集群,已提前安装与Spark版本兼容的
hadoop-azure、azure-identity依赖包;Azure托管Spark服务(Databricks、Synapse Spark池)无需额外安装依赖。
场景1:Azure托管Spark服务
这类环境已经默认集成Azure AD鉴权能力,直接用ABFSS协议访问存储路径即可。
代码示例
// 存储路径格式:abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<目标文件路径> val storagePath = "abfss://demo-container@demostorageaccount.dfs.core.windows.net/data/order.parquet" // 直接读取数据 val df = spark.read.parquet(storagePath) df.show()
场景2:自建Spark集群
需要在SparkSession初始化时增加Azure AD OAuth鉴权配置,再访问存储路径即可。如果你的Spark集群部署在Azure VM/VMSS上,直接绑定对应托管身份即可;本地调试场景可搭配Azure CLI登录账号实现鉴权。
配置+代码示例
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("azure-blob-no-key-demo") // 开启Azure AD OAuth鉴权 .config("spark.hadoop.fs.azure.account.auth.type", "OAuth") .config("spark.hadoop.fs.azure.oauth.access.token.provider.type", "ManagedIdentity") // 若使用用户分配托管身份,补充以下配置,替换为对应托管身份的客户端ID // .config("spark.hadoop.fs.azure.oauth.managed.identity.client.id", "xxxx-xxxx-xxxx-xxxx") .getOrCreate() // 同托管Spark场景,用ABFSS协议访问存储路径 val storagePath = "abfss://demo-container@demostorageaccount.dfs.core.windows.net/data/order.parquet" val df = spark.read.parquet(storagePath) df.show()
常见问题说明
角色分配完成后最长需要15分钟生效,若刚分配完权限提示鉴权失败,可稍等几分钟再重试。
若使用低版本hadoop-azure包不支持ABFSS协议,可替换为WASBS协议,鉴权配置前缀调整为spark.hadoop.fs.azure.account.auth.type.<存储账户名>.blob.core.windows.net即可。
内容的提问来源于stack exchange,提问作者Ranjan Thakur
相关产品推荐
相关产品推荐

