在Spark中从Azure存储账户读取文件——不使用密钥
在Spark中从Azure存储账户读取文件——不使用密钥
嗨,刚好之前帮朋友解决过一模一样的本地Spark开发场景——不用SAS令牌或存储账户密钥,完全靠Azure AD身份验证就能搞定!给你几个亲测有效的方案:
方案一:用Azure AD用户身份(本地交互式登录,最适合手动开发调试)
这个方案最适合你日常本地调试用,只要你有有权限访问存储账户的Azure AD工作账号就行:
- 先确保本地装了Azure CLI,打开终端运行
az login,跟着提示用你的AD账号完成登录(会跳转到浏览器验证); - 给你的AD账号在Azure存储账户的容器上分配存储Blob数据读取者(或更高权限,比如存储Blob数据参与者)的角色——别忘这一步,不然有权限也读不了;
- 在Spark会话里配置Azure AD OAuth认证,直接用ABFS路径读取文件就行。举个Python的例子:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("LocalSparkAzureStorage") \ # 配置OAuth认证 .config("fs.azure.account.auth.type", "OAuth") \ .config("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.AzureCliTokenProvider") \ .getOrCreate() # 直接用abfss路径读取,格式是 abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<文件路径> df = spark.read.csv("abfss://mycontainer@mystorageaccount.dfs.core.windows.net/sample-data.csv") df.show()
原理是Spark会自动拾取Azure CLI缓存的登录凭据,完全不用手动输入任何密钥~
方案二:用Azure AD服务主体+证书认证(适合非交互式自动运行)
如果你需要本地Spark任务自动运行(比如定时脚本),不想每次手动az login,可以用服务主体+证书的方式,全程不用密钥:
- 在Azure AD里创建一个服务主体,然后上传一个自签名或CA颁发的证书(别用密钥创建,选证书选项);
- 给这个服务主体分配存储Blob数据读取者角色到目标存储容器;
- 在Spark会话里配置证书相关的参数,示例代码(Python):
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("SparkAzureCertAuth") \ .config("fs.azure.account.auth.type", "OAuth") \ .config("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") \ .config("fs.azure.account.oauth2.client.id", "<你的服务主体ID>") \ .config("fs.azure.account.oauth2.client.certificate.path", "C:/local/certs/my-cert.pfx") # 本地证书路径 .config("fs.azure.account.oauth2.client.certificate.password", "<证书的保护密码>") .config("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<你的Azure租户ID>/oauth2/token") \ .getOrCreate() # 同样用abfss路径读取 df = spark.read.parquet("abfss://mycontainer@mystorageaccount.dfs.core.windows.net/parquet-data/")
这个方案适合需要无人值守的本地Spark任务,完全避开了密钥的使用。
几个要注意的小坑:
- 确保你的Spark依赖的
hadoop-azure包版本在3.2以上,不然可能不支持这些OAuth认证提供者; - 如果存储账户开了防火墙,一定要把你的本地IP地址加入存储账户的允许列表,不然即使权限够也连不上;
- Azure AD角色分配通常需要1-5分钟生效,刚分配完就测试可能会遇到权限错误,别急,等几分钟再试~
如果还有配置细节或者权限相关的问题,随时说,我再给你捋清楚!
内容来源于stack exchange
相关产品推荐
相关产品推荐

