Docker中Jupyter Notebook的PySpark连接本地PostgreSQL失败求助
问题排查与解决方案
核心原因
Docker容器内的localhost指向容器自身,而非你的Windows主机,因此代码中用localhost无法访问安装在Windows上的PostgreSQL服务。
具体解决步骤
1. 修改JDBC连接地址
将代码中的URL替换为Docker访问Windows主机的专用地址host.docker.internal,或者Windows主机的实际IPv4地址:
# 替换为Docker专用地址 url = "jdbc:postgresql://host.docker.internal:5432/local_database" # 或者使用Windows主机的实际IP(通过ipconfig查看以太网适配器的IPv4地址) # url = "jdbc:postgresql://192.168.x.x:5432/local_database"
2. 修正PostgreSQL配置(确保生效)
- 修改
postgresql.conf:将listen_addresses设为*,允许所有IP访问listen_addresses = '*' - 确认
pg_hba.conf的规则已正确添加:host all all 0.0.0.0/0 md5 - 重启PostgreSQL服务(修改配置后必须重启才能生效)
3. 检查Windows防火墙
确保Windows防火墙允许PostgreSQL服务的5432端口入站连接:
- 打开Windows Defender防火墙 → 高级设置 → 入站规则
- 新建规则,允许TCP端口5432的连接
4. 验证容器到主机的连通性
进入Docker容器内部,执行以下命令测试:
# 测试主机地址是否可达 ping host.docker.internal # 测试5432端口是否开放 telnet host.docker.internal 5432 # 或者用nc(若容器内已安装) nc -zv host.docker.internal 5432
完整修改后的代码片段
from pyspark.sql import SparkSession from pyspark.sql.functions import lit, col, explode import pyspark.sql.functions as f spark = SparkSession.builder.appName("ETL Pipeline").config("spark.jars", "./postgresql-42.7.1.jar").getOrCreate() df = spark.read.text("./Data/WordData.txt") df2 = df.withColumn("splitedData", f.split("value"," ")) df3 = df2.withColumn("words", explode("splitedData")) wordsDF = df3.select("words") wordCount = wordsDF.groupBy("words").count() driver = "org.postgresql.Driver" # 修改后的URL url = "jdbc:postgresql://host.docker.internal:5432/local_database" table = "word_count" user = "postgres" password = "12345" wordCount.write.format("jdbc") \ .option("driver", driver) \ .option("url", url) \ .option("dbtable", table) \ .option("mode", "append") \ .option("user", user) \ .option("password", password) \ .save() spark.stop()
内容的提问来源于stack exchange,提问作者Roterun
相关产品推荐
相关产品推荐

