Spark Worker抛出java.net.UnknownHostException问题排查求助
问题根源
报错java.net.UnknownHostException: Jake说明Spark Executor无法解析名为Jake的主机地址。这个Jake是你本地宿主机的hostname,当你在Jupyter中启动Spark Session作为Driver时,Driver会把自己的hostname(Jake)告知Executor,但Docker容器所在的网络无法解析这个本地hostname,导致Executor无法连接Driver,进而反复退出重启。
解决方案
1. 显式指定Spark Driver的宿主机IP
在创建Spark Session时,通过spark.driver.host配置项指定你的宿主机局域网IP(比如192.168.x.x),让Executor能直接解析到Driver的地址:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .master("spark://spark-master:7077") # 替换成你的Master容器名或IP .appName("TaskTest") \ .config("spark.driver.host", "192.168.1.105") # 替换为你的宿主机实际IP .getOrCreate()
2. 固定Driver端口并开放防火墙(可选)
如果宿主机有防火墙限制,可以固定Driver的端口,避免随机端口带来的访问问题:
spark = SparkSession.builder \ .master("spark://spark-master:7077") .appName("TaskTest") \ .config("spark.driver.host", "192.168.1.105") .config("spark.driver.port", "57142") # 用报错里的端口或自定义固定端口 .getOrCreate()
然后在宿主机防火墙中开放这个固定端口,允许Docker容器访问。
3. 确保网络连通性
- 如果Jupyter是运行在Docker容器中,要保证它和Spark集群在同一个Docker网络内(docker-compose默认会创建专属网络,只需把Jupyter容器加入该网络即可)。
- 如果Jupyter在本地运行,确认宿主机IP能被Spark容器正常ping通(进入Spark Worker容器执行
ping 宿主机IP测试)。
4. 禁用Driver hostname自动解析(可选)
在Spark的配置文件或docker-compose的环境变量中添加:
# 在Spark Master/Worker的环境变量里添加 environment: - SPARK_DRIVER_HOST=192.168.1.105
不过更推荐在创建Spark Session时动态指定,灵活性更高。
内容的提问来源于stack exchange,提问作者Tuan
相关产品推荐
相关产品推荐

