Docker部署Spark集群提交作业报初始作业未接收资源错误如何解决
解决方案
问题根因
Spark提交作业时,驱动会自动探测本地IP生成对外广播的CoarseGrainedScheduler地址,你的WSL2默认运行在NAT网络模式下,自动探测到的172.25.230.63是Windows宿主机内部虚拟网段IP,仅Windows本地可访问,Linux桌面的Docker集群Worker节点无法连通该地址。直接指定Windows局域网IP时,WSL2实例未直接绑定该IP,因此Spark进程无法完成监听绑定。
方案1:端口映射+显式配置驱动参数(无需改动现有网络架构,最推荐)
操作步骤:
- 提交作业时显式指定驱动对外地址和固定端口,示例提交命令:
spark-submit \ --master spark://<你的Spark Master节点对外IP>:7077 \ --conf spark.driver.host=<Windows主机的局域网IP> \ --conf spark.driver.port=30000 \ 你的作业包.jar
- 在Windows宿主机以管理员身份运行CMD/PowerShell,执行端口转发规则,将Windows局域网IP的30000端口流量转发到WSL2实例的对应端口:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=30000 connectaddress=172.25.230.63 connectport=30000
- 放开Windows防火墙30000端口的入站规则,或临时关闭防火墙验证连通性。
- 验证:随便找一台Worker节点执行
telnet <Windows局域网IP> 30000,确认连通正常后再提交作业即可。
方案2:WSL2切换桥接网络模式(一劳永逸)
直接让WSL2实例获取和Windows宿主机同网段的局域网IP,无需端口转发:
- 打开Windows的Hyper-V管理器,新建一个外部虚拟交换机,绑定你当前接入局域网的物理网卡。
- 在Windows用户目录下新建/编辑
.wslconfig文件,添加以下配置:
[wsl2] networkingMode=bridged vmSwitch=<你刚才新建的虚拟交换机名称>
- 执行
wsl --shutdown重启WSL2,重启后WSL2会直接从局域网路由器获取IP,此时你提交作业时直接指定spark.driver.host为WSL2的新局域网IP即可,不需要额外端口转发。
方案3:驱动放入Docker容器运行
将提交作业的驱动进程放在和Spark集群同Docker网络的容器内运行,驱动IP自动为Docker内网可路由地址,所有Worker可直接连通,不需要处理跨网络问题。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

