PySpark通过JDBC连接SQL Server时TCP/IP 1433端口连接失败求助
PySpark JDBC连接SQL Server报TCP/IP连接失败(Connection refused)的排查方案
针对你遇到的Py4JJavaError(核心为TCP/IP连接被拒绝),结合你已完成的防火墙规则添加、TCP/IP协议启用操作,按以下步骤逐一排查:
1. 确认SQL Server实例实际监听的端口
默认情况下SQL Server未必固定使用1433端口(尤其是Express版或命名实例):
- 打开SQL Server配置管理器,展开「SQL Server网络配置」→ 对应实例的「协议」,右键点击「TCP/IP」→「属性」
- 切换到「IP地址」标签,拉至最下方的「IPAll」区域:
- 若「TCP动态端口」有数值,说明实例使用动态端口(如51234),而非1433
- 若「TCP端口」有数值,该值即为固定监听端口
- 查看SQL Server的ERRORLOG,找到包含
Server is listening on的日志行,其中会明确显示实例监听的IP与端口
2. 验证端口的实际监听状态
通过Windows命令行确认端口是否被SQL Server进程占用:
netstat -ano | findstr "你的端口号"
- 若输出无
LISTENING状态记录,说明SQL Server未在该端口监听,直接替换JDBC URL中的端口为实际监听端口 - 若有
LISTENING记录,查看对应PID,打开任务管理器确认该PID对应的进程为sqlservr.exe
3. 检查SQL Server实例服务状态
打开服务管理器(运行services.msc):
- 找到你的SQL Server实例服务(默认实例为「SQL Server (MSSQLSERVER)」,命名实例为「SQL Server (实例名)」)
- 确认服务状态为「正在运行」,若未运行,右键启动服务
4. 调整JDBC URL的连接格式
根据实例类型修改URL:
- 命名实例:无需指定端口,直接用实例名连接:
jdbc_url = f"jdbc:sqlserver://{host}\INSTANCE_NAME;databaseName={database};integratedSecurity=true;" - 动态端口的默认实例:用实际查到的动态端口替换1433:
jdbc_url = f"jdbc:sqlserver://{host}:动态端口号;databaseName={database};integratedSecurity=true;" - 尝试用
127.0.0.1代替localhost,规避本地DNS解析问题:jdbc_url = f"jdbc:sqlserver://127.0.0.1:实际端口;databaseName={database};integratedSecurity=true;"
5. 排除Windows身份验证的干扰
暂时改用SQL Server身份验证测试,确认连接问题是否与身份验证相关:
jdbc_url = f"jdbc:sqlserver://{host}:实际端口;databaseName={database};user=你的SQL账号;password=你的密码;"
若能成功连接,再回头排查Windows身份验证配置:
- 确认
mssql-jdbc_auth-12.8.1.x64.dll路径正确,且与你的JDK版本匹配(代码中使用jre8,需对应64位JDK 8) - 确保
spark.driver.extraJavaOptions中的java.library.path指向dll所在文件夹(而非dll文件本身),例如:.config("spark.driver.extraJavaOptions", "-Djava.library.path=C:/Users/~/sqljdbc_12.8/enu/auth/x64/")
6. 再次测试telnet连接
使用实际端口测试telnet:
telnet 127.0.0.1 实际端口
若仍失败,说明端口未对外开放,重新检查:
- 防火墙入站规则是否覆盖实际端口
- SQL Server的TCP/IP协议是否在所有IP地址上启用(在TCP/IP属性的「IP地址」标签中,确保每个IP的「已启用」为「是」)
内容的提问来源于stack exchange,提问作者abbym
相关产品推荐
相关产品推荐

