Azure Synapse Spark笔记本跨工作区连接读取SQL池表的实现及报错处理
跨私有网络场景下Scala Spark读取跨工作区Azure Synapse SQL池的实现方案
Linked Service参数的支持有效性
当前Synapse内置的SQL Analytics Connector支持通过Linked Service参数传入连接配置,对应的常量定义Constants.LINKED_SERVICE可直接调用,官方文档未单独覆盖跨工作区私有网络的适配场景。
使用该参数时,连接器会自动从已配置的Linked Service中拉取目标连接的服务器地址、认证信息、网络路由规则,无需手动拼接连接参数,可直接复用pipeline已经验证通过的跨工作区连通链路。
适配私有网络场景的标准Scala读表代码
%%spark import com.microsoft.spark.sqlanalytics.utils.Constants import org.apache.spark.sql.SqlAnalyticsConnector._ val df = spark.read .option(Constants.LINKED_SERVICE, "当前Synapse工作区已配置的跨目标SQL池的Linked Service名称") .synapsesql("<目标SQL池所在数据库名>.<Schema名称>.<目标表名称>") // 触发计算完成后可直接做结果校验 df.show(10)
报错根因解释
出现“Data exfiltration to 'DATALAKE_NAME.dfs.core.windows.net' is blocked”类报错,和访问SQL池的目标无关,本质是SQL Analytics Connector的运行机制触发了目标SQL池的出站访问策略:
- 连接器读取大表时不会采用纯JDBC逐行拉取的低性能模式,而是会生成Polybase导出任务,将目标SQL池的表数据临时写入当前Spark工作区关联的默认ADLS Gen2存储做中转,再由Spark从该存储读取数据生成DataFrame
- 目标侧的SQL池开启了数据外泄保护策略,该策略会阻断目标SQL池向不在白名单内的存储账户发起的所有出站写入请求,和网络层是否配置了私有端点无关联——私有端点只解决网络可达性问题,无法绕过SQL池层面的出站访问控制规则
- 未使用Linked Service的原有写法,会让连接器默认走公网连接逻辑,自动生成的Polybase中转存储地址未被加入目标SQL池的外泄允许列表,因此触发拦截报错。
落地前的前置校验项
- 确认在运行Spark Notebook的当前Synapse工作区,已创建指向目标SQL池的Linked Service,且连通性测试结果为通过(可直接复用pipeline中已验证可正常使用的同名Linked Service)
- 在目标侧Synapse工作区的目标SQL池网络设置页,将当前Spark工作区关联的ADLS Gen2存储账户,添加到“允许数据外泄的目标存储列表”中
- 替换参数后无需额外配置公网访问规则,所有流量会通过已打通的私有端点链路传输。
内容的提问来源于stack exchange,提问作者manuel bustamante
相关产品推荐
相关产品推荐

