MacBook与OpenShift集群间Spark Driver-Executor通信故障求助
Spark Driver(MacBook Jupyter)对接OpenShift Executor任务循环失败排查思路
问题背景
Spark Driver部署在MacBook的Jupyter Notebook(PySpark),通过VPN连接OpenShift Kubernetes集群,Executor计划在集群内运行。已成功创建Spark Session,但任务执行失败并陷入循环;同一代码在OpenShift集群内运行正常,推测核心问题为Driver与Executor间的网络通信通道未建立。
核心排查方向及步骤
一、Driver侧网络连通性验证(优先排查)
- 防火墙端口放行:
- 检查MacBook防火墙设置,确保配置的
spark.driver.port=29413以及Spark BlockManager端口(默认随机,可通过spark.driver.blockManagerPort固定)允许OpenShift集群VPN网段的入站连接。 - 本地执行
nc -l 29413监听端口,在OpenShift集群内启动测试Pod(如busybox),执行nc <Driver的VPN IP> 29413,验证端口是否可连通。
- 检查MacBook防火墙设置,确保配置的
- Driver IP准确性:
- 日志显示
hostname resolves to 127.0.0.1; using 10.0.0.35,但代码中socket.gethostbyname(socket.gethostname())获取的可能是本地局域网IP,而非VPN分配的集群可达IP。 - 执行
ifconfig(macOS)查看VPN接口IP,手动设置spark.driver.host为该IP,而非自动解析的主机名IP;同时验证OpenShift集群内能否Ping通该VPN IP,若不通需排查VPN路由配置。
- 日志显示
二、Spark配置参数校验
- 端口绑定与暴露:
- 确认
spark.driver.bindAddress=0.0.0.0生效,确保Driver监听所有网卡,而非仅本地回环地址。 - 建议固定BlockManager端口(如添加
spark.driver.blockManagerPort=29414),并同步在防火墙放行该端口,避免临时随机端口被拦截。
- 确认
- Kubernetes配置检查:
- 核对
spark.kubernetes.executor.podTemplateFile中的Pod网络策略,确保允许Executor主动发起对Driver VPN IP及端口的连接。 - 确认
spark.kubernetes.authenticate.driver.oauthToken的令牌权限足够,能创建Executor Pod并调度到指定的event-driven-pyspark-deenu-macbook调度器。
- 核对
三、Executor Pod状态与日志分析
- Pod状态排查:
- 用
oc get pods或OpenShift控制台查看Executor Pod状态:若处于Pending,检查调度器是否存在、集群资源是否充足、Pod模板镜像拉取是否正常;若处于Running后快速退出,需进一步查看Pod日志。 - 查看Executor Pod日志(
oc logs <executor-pod-name>),重点关注是否有Cannot connect to driver <IP>:<port>类报错,此类信息可直接定位网络不通或配置错误。
- 用
- 日志异常点解读:
日志中Asked to remove non-existent executor 5说明Driver尝试管理一个未成功回连的Executor,Executor启动后无法与Driver建立通信,被Driver标记为丢失,进而触发重新创建,形成循环。
四、VPN网络细节排查
- 隧道模式确认:检查VPN是否为全隧道模式,若为拆分隧道,需确认OpenShift集群网段已纳入VPN路由范围,否则Executor无法访问Driver的VPN IP。
- NAT配置检查:部分VPN会对客户端IP做NAT,此时
spark.driver.host需设置为NAT后的集群可达IP,而非本地VPN接口IP。
内容的提问来源于stack exchange,提问作者Deenu Yadav
相关产品推荐
相关产品推荐

