Synapse notebook中用多链接服务访问同一Azure Gen2存储多路径的问题
Synapse Notebook多链接服务访问同存储账户解决方案
报错原因
你使用的spark.conf.set是全局Spark会话配置,同一Azure存储账户的访问令牌会被Spark会话缓存,即使后续修改全局链接服务配置,旧的令牌也不会被替换,后访问的路径仍会使用首个SPN的权限,因此触发403权限错误。
实现方案
可以在同一个Synapse Notebook中使用多个不同链接服务访问同个存储账户的不同路径,不需要修改全局Spark配置,改用mssparkutils的路径绑定链接服务功能即可,具体代码如下:
# 绑定path1对应SPN1的链接服务 linked_service1 = 'ln_spn1_path_1' path1 = "abfss://container@storageaccount.dfs.core.windows.net/path1" mssparkutils.credentials.bindLinkedServiceToPath(path1, linked_service1) # 直接访问path1 print(mssparkutils.fs.ls(path1))
# 绑定path2对应SPN2的链接服务 linked_service2 = 'ln_spn2_path_2' path2 = "abfss://container@storageaccount.dfs.core.windows.net/path2" mssparkutils.credentials.bindLinkedServiceToPath(path2, linked_service2) # 直接访问path2 print(mssparkutils.fs.ls(path2))
注意事项
- 路径绑定为前缀匹配规则,访问路径只要和绑定的路径前缀匹配,就会使用对应链接服务的权限;如果路径存在包含关系,优先绑定层级更细的路径
- 绑定仅在当前Spark会话生效,会话结束后自动失效
- 绑定完成后读写对应路径不需要额外设置认证配置,直接通过路径访问即可
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

