Databricks Runtime10.4 JDBC连SQLServer正常,12.2用sqlserver格式报错
问题:Databricks Runtime 12.2使用SQL Server新连接方式触发SSL证书错误
背景
在Databricks Runtime 10.4中,使用旧JDBC驱动可成功读取SQL Server数据,代码如下:
remote_table = ( spark.read.format("jdbc") .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") .option("url", "jdbc:sqlserver://mydomainname.com;database=Runtime") .option("dbtable", "Runtime.dbo.History") .option("user", "myusername") .option("password", "mypassword") .load() )
切换至Runtime 12.2集群后,采用官方新的SQL Server连接方式,代码如下:
remote_table = (spark.read .format("sqlserver") .option("host", "mydomainname.com") .option("user", "myusername") .option("password", "mypassword") .option("database", "Runtime") .option("dbtable", "Runtime.dbo.History") .load() )
报错信息
com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:56f3b77d-a90a-4c89-98be-88924f364897
解决方案
方案1:临时禁用SSL验证(仅适用于测试环境)
添加encrypt=false参数跳过SSL证书校验,修改后的代码:
remote_table = (spark.read .format("sqlserver") .option("host", "mydomainname.com") .option("user", "myusername") .option("password", "mypassword") .option("database", "Runtime") .option("dbtable", "Runtime.dbo.History") .option("encrypt", "false") .load() )
⚠️ 生产环境禁止使用此方案,会导致连接安全性降低。
方案2:导入SQL Server CA证书至集群
- 获取SQL Server的根CA证书(通常为
.cer格式); - 将证书上传至Databricks的DBFS路径(例如
dbfs:/certificates/sqlserver-ca.cer); - 编辑集群配置,在Spark > Spark config中添加以下参数:
spark.driver.extraJavaOptions -Djavax.net.ssl.trustStore=/dbfs/certificates/sqlserver-ca.cer spark.executor.extraJavaOptions -Djavax.net.ssl.trustStore=/dbfs/certificates/sqlserver-ca.cer - 重启集群后重新执行连接代码。
方案3:通过JDBC URL指定证书参数
利用sqlserver格式支持的JDBC扩展参数,直接在URL中配置SSL相关选项:
remote_table = (spark.read .format("sqlserver") .option("url", "jdbc:sqlserver://mydomainname.com;database=Runtime;encrypt=true;trustStore=/dbfs/certificates/sqlserver-ca.cer") .option("user", "myusername") .option("password", "mypassword") .option("dbtable", "Runtime.dbo.History") .load() )
如果不需要严格校验证书,也可以使用trustServerCertificate=true替代证书路径:
remote_table = (spark.read .format("sqlserver") .option("url", "jdbc:sqlserver://mydomainname.com;database=Runtime;encrypt=true;trustServerCertificate=true") .option("user", "myusername") .option("password", "mypassword") .option("dbtable", "Runtime.dbo.History") .load() )
内容的提问来源于stack exchange,提问作者Oliver Angelil
相关产品推荐
相关产品推荐

