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

在Spark中从Azure存储账户读取文件——不使用密钥

在Spark中从Azure存储账户读取文件——不使用密钥

嗨,刚好之前帮朋友解决过一模一样的本地Spark开发场景——不用SAS令牌或存储账户密钥,完全靠Azure AD身份验证就能搞定!给你几个亲测有效的方案:

方案一:用Azure AD用户身份(本地交互式登录,最适合手动开发调试)

这个方案最适合你日常本地调试用,只要你有有权限访问存储账户的Azure AD工作账号就行:

  1. 先确保本地装了Azure CLI,打开终端运行 az login,跟着提示用你的AD账号完成登录(会跳转到浏览器验证);
  2. 给你的AD账号在Azure存储账户的容器上分配存储Blob数据读取者(或更高权限,比如存储Blob数据参与者)的角色——别忘这一步,不然有权限也读不了;
  3. 在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,可以用服务主体+证书的方式,全程不用密钥:

  1. 在Azure AD里创建一个服务主体,然后上传一个自签名或CA颁发的证书(别用密钥创建,选证书选项);
  2. 给这个服务主体分配存储Blob数据读取者角色到目标存储容器;
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:48:00