用户在开发一个数据分析平台,需要将本地数据通过 Spark 写入 Azure Blob Storage,并使用 Azure Managed Identity(MI)进行认证。在测试过程中,发现因为 API 版本问题(Hadoop Azure 的 MSI endpoint 默认使用固定的 API 版本(例如 2018-02-01),这个版本可能已经被废弃),无法成功连接。
解决方案
修改并使用自定义 MSI Token Provider。若需要在 Spark 中继续使用 Pyspark 配置,可以通过以下步骤实现。
编写一个 Java 类,继承 MsiTokenProvider,并修改 api-version 的获取逻辑。例如:
import org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider;
public class CustomMsiTokenProvider extends MsiTokenProvider {
@Override
protected String getTokenEndpoint() {
// 设置动态 API 版本
return super.getTokenEndpoint() + "?api-version=2021-02-01";
}
}
将自定义类加载到 Spark,编译 Java 类,生成 JAR 文件,并将其添加到 Spark 环境的 jars 中。然后在 Spark 配置中指定使用这个自定义类:
spark.conf.set(
f"fs.azure.account.oauth.provider.type.{account_name}.dfs.core.windows.net",
"com.example.CustomMsiTokenProvider"
)
然后尝试写入或读取数据文件,确认问题已解决。