Azure机器学习中使用Synapse SparkPool访问Dataset时身份验证失败
最近把Synapse Spark池作为附加计算资源加到Azure机器学习(AML)后,使用AML Dataset访问Azure Data Lake Storage Gen2时触发如下错误:
Resolving access token for scope "https://storage.azure.com/.default" using identity of type "MANAGED". No identity was found on compute.
Dataset调用代码示例:
ds = Dataset.get_by_name(ws, "XXXXXXXX")
但在同个Spark池的Notebook中直接用Spark代码访问存储却能正常执行:
STRUCTURED_PATH = 'abfss://curated@xxxx.dfs.core.windows.net' df_xxxxxx = spark.read.load(STRUCTURED_PATH+'/xxxx/xxxx.snappy.parquet', format='parquet')
问题原因
AML Dataset默认会尝试使用AML计算实例的托管标识获取存储访问令牌,但附加的Synapse Spark池并未与该标识正确关联;而直接使用Spark代码时,依托的是Synapse Spark自身的身份(工作区系统分配MSI、用户分配MSI或服务主体),该身份已被授予存储访问权限,因此可以正常访问。
解决方案
为Synapse Spark池的身份配置存储权限
打开ADLS Gen2存储账户的「Access Control (IAM)」页面,添加「存储Blob数据参与者」角色分配,将Synapse Spark池使用的身份(系统分配MSI/用户分配MSI/服务主体)设为分配对象。在AML附加计算时指定正确身份
在AML中配置附加Synapse Spark池时:- 若使用系统分配MSI,需确保AML工作区具备Synapse工作区访问权限,且该MSI已获得存储权限;
- 若使用用户分配MSI,需在附加计算配置步骤中明确选择对应标识,同时确保该标识拥有存储访问权限。
调整Dataset的调用方式
获取Dataset后,复用当前Spark会话的身份加载数据,避免AML单独尝试获取令牌:ds = Dataset.get_by_name(ws, "XXXXXXXX") spark_df = ds.to_spark_dataframe()此方式会让Dataset使用Synapse Spark已授权的身份访问存储,规避身份找不到的错误。
内容的提问来源于stack exchange,提问作者Guillermo Páez

