如何在Spark应用中通过Python的DefaultAzureCredential实现ABFSS认证?
使用DefaultAzureCredential实现Spark ABFSS跨环境认证
前置依赖
先安装必要的Python包:
pip install pyspark azure-identity
实现步骤
1. 获取存储账户访问令牌
使用DefaultAzureCredential自动适配本地和生产环境的认证方式,获取存储账户的OAuth2令牌:
from pyspark.sql import SparkSession from azure.identity import DefaultAzureCredential # 替换为你的Azure存储账户名称 STORAGE_ACCOUNT = "your-storage-account" # 存储账户的令牌请求URL TOKEN_URL = f"https://{STORAGE_ACCOUNT}.dfs.core.windows.net/.default" # 初始化凭据,自动尝试多种认证方式(Azure CLI/VS Code/MSI/环境变量等) credential = DefaultAzureCredential() # 获取访问令牌 access_token = credential.get_token(TOKEN_URL).token
2. 配置Spark会话
将获取到的令牌配置到Spark的ABFSS参数中,使用AccessTokenTokenProvider直接传入令牌:
spark = SparkSession.builder \ .appName("ABFSS-Cross-Env-Auth") \ # 启用OAuth认证 .config("fs.azure.account.auth.type", "OAuth") \ # 指定令牌提供者为AccessTokenTokenProvider .config("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.AccessTokenTokenProvider") \ # 传入获取到的访问令牌 .config(f"fs.azure.account.oauth2.access.token", access_token) \ .getOrCreate()
3. 读取ABFSS路径数据
直接使用标准的Spark读取API访问ABFSS路径:
# 替换为你的容器和数据路径 ABFSS_PATH = f"abfss://your-container@{STORAGE_ACCOUNT}.dfs.core.windows.net/path/to/data" # 示例:读取Parquet文件 df = spark.read.parquet(ABFSS_PATH) df.show()
跨环境适配说明
- 本地开发:
DefaultAzureCredential会自动使用你本地已登录的Azure CLI、VS Code Azure插件或Azure PowerShell凭据,无需额外配置。 - 生产环境:部署到Azure托管服务(如HDInsight、Databricks)时,会自动使用服务的托管身份(MSI)进行认证,代码无需修改。
注意事项
- 确保你的身份(本地账户或MSI)拥有存储账户的Storage Blob Data Reader(或更高权限),否则会出现权限拒绝错误。
- 令牌有效期默认1小时,如果作业运行超过1小时,需要重新获取令牌并更新Spark配置(可通过定时刷新或动态配置实现)。
内容的提问来源于stack exchange,提问作者lefli
相关产品推荐
相关产品推荐

