Azure Databricks通过JDBC连接Azure PostgreSQL失败,无法获取数据
看起来你已经把基础的配置项都排查了一遍,但还是遇到连接失败的问题,我帮你梳理几个容易被忽略的检查点和调试方向,应该能帮你定位问题:
JDBC URL占位符与数据库名检查:先确认你替换
<HOST>和<DATABASE>的时候有没有出错——Azure PostgreSQL的主机名格式通常是xxx.postgres.database.azure.com,要确保完全复制正确;另外PostgreSQL的数据库名默认区分大小写,如果你创建数据库时用的是小写,千万别写成大写,不然会直接找不到目标库。认证参数的细节:Azure PostgreSQL的用户名格式要求是
用户名@服务器名(比如myuser@mypgserver),很多人会漏写@后面的服务器名导致认证失败。另外,你在Spark的JDBC配置里有没有明确传入user和password参数?比如在spark.read.format("jdbc").option("user", "xxx").option("password", "xxx")这类配置里,这俩参数是必须的,不能漏。SSL配置的进阶检查:虽然你加了
sslmode=require,可以试试把它改成verify-full,有时候Azure PostgreSQL对SSL的验证要求更高。另外,你用的42.6.0驱动版本是兼容的,但可以确认下你的Azure PostgreSQL服务器版本(比如11、13、14)和驱动的匹配性,不过这个概率比较低。驱动安装与集群状态:你是通过集群库安装的
org.postgresql:postgresql:42.6.0吗?先去集群的“库”页面确认驱动状态是“已安装”,而且如果是在集群运行时安装的驱动,必须重启集群才能生效,很多人会忘了这一步!另外可以在Notebook里运行%sh echo $SPARK_DRIVER_CLASSPATH,看看输出里有没有包含PostgreSQL驱动的jar包路径,确认驱动确实被加载了。VNet与子网的精细配置:虽然你说在同一个VNet,但要检查PostgreSQL的VNet规则是不是把Databricks集群所在的子网加进了允许列表?另外,如果Databricks集群用的是“无公共IP”模式,还要确认VNet的路由表有没有配置正确的路由规则,让Databricks节点能访问到PostgreSQL的节点。还有,别漏了检查Databricks子网的NSG出站规则,是不是允许5432端口的流量到PostgreSQL的IP?
网络连通性调试:在Databricks Notebook里用shell命令直接测试网络连通性,比如运行
%sh telnet <HOST> 5432或者%sh nc -zv <HOST> 5432。如果命令执行失败,那肯定是网络层面的问题;如果能连通,那问题就出在JDBC的配置或者认证上,就能缩小排查范围。
备注:内容来源于stack exchange,提问作者sourabh baligade

