如何配置Spark在AKS Pod中使用Azure工作负载身份访问存储?
正确配置Spark通过Azure托管身份(工作负载身份)访问ADLS Gen2
前提准备
- 确保你的Spark运行环境(Azure Databricks/HDInsight/Azure VM/AKS等)已启用托管身份(系统分配或用户分配)。
- 为该托管身份在目标ADLS Gen2存储账户/容器上分配Storage Blob Data Contributor(或对应权限的角色,如只读场景用Storage Blob Data Reader),注意必须是数据平面角色,而非管理平面的Reader角色。
具体Spark配置
场景1:使用系统分配托管身份
无需指定托管身份的Client ID,配置如下:
spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider") spark.conf.set("fs.azure.account.oauth2.msi.tenant.<storage-account>.dfs.core.windows.net", "<directory-id>")
替换<storage-account>为你的存储账户名,<directory-id>为Azure AD租户ID。
场景2:使用用户分配托管身份
需要指定用户分配托管身份的Client ID,配置如下:
spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider") spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net", "<managed-identity-client-id>") spark.conf.set("fs.azure.account.oauth2.msi.tenant.<storage-account>.dfs.core.windows.net", "<directory-id>")
替换<storage-account>、<managed-identity-client-id>(用户分配托管身份的客户端ID)、<directory-id>为对应值。
关键注意事项
- 使用存储账户级配置:所有属性需添加
<storage-account>.dfs.core.windows.net后缀,避免全局配置影响其他存储账户,这也是你之前用全局XML配置可能出错的原因之一。 - Hadoop版本兼容性:确保Spark依赖的Hadoop版本在3.2及以上,该版本开始稳定支持
MsiTokenProvider。 - 错误排查:若仍出现含HTML的错误,可通过以下方式验证:
- 在Spark运行环境中,用Azure CLI测试托管身份有效性:
az login --identity,随后执行az storage blob list --account-name <storage-account> --container-name <container>,若能正常列出Blob,说明身份权限配置正确;若失败,检查角色分配是否生效(角色分配可能需要数分钟同步)。 - 确认租户ID、托管身份Client ID等参数无拼写错误。
- 在Spark运行环境中,用Azure CLI测试托管身份有效性:
内容的提问来源于stack exchange,提问作者btrose
相关产品推荐
相关产品推荐

