“Connection refused”错误主因是TCP连接阶段目标端口无监听进程,需依次排查服务状态、网络连通性、主机名解析、端口配置匹配及UI端口冲突五方面。
如果您在运行Spark任务时遇到“Connection refused”错误,该问题通常与网络连通性或服务未就绪有关,而非Executor被Kill的直接表现。Executor被Kill一般会伴随YARN Container killed日志、内存溢出(OOM)堆栈或明确的exitCode(如137、143),而Connection refused指向的是TCP连接阶段失败,即客户端尝试建立Socket连接时目标地址和端口无监听进程响应。以下是针对该报错的多种排查与修复路径:
一、检查Driver或Master服务是否实际启动并监听对应端口
Connection refused最常见原因是目标服务未运行或绑定地址/端口不匹配。Spark Driver、Master、ApplicationMaster、HDFS NameNode等组件若未成功启动,或启动后监听在非预期IP或端口,将导致其他节点无法建立连接。
1、在报错涉及的节点(如Driver所在机器或Master节点)执行
(Spark Master默认端口)或
(Spark UI常用端口),确认服务进程确实在监听。
2、使用
检查相关进程是否存在;若使用YARN模式,还需确认ResourceManager和NodeManager已正常运行。
3、验证配置文件中指定的host和port是否与实际启动地址一致,例如
配置为
,但node02上Master实际未启动或监听在
而非
,会导致外部节点连接被拒。
二、验证节点间网络可达性及防火墙策略
即使服务已启动,若中间存在网络阻断或系统级防火墙拦截,也会触发Connection refused。该类问题在跨物理机、跨VPC或容器化部署中尤为典型。
1、从报错客户端节点执行
或
,确认TCP连接能否建立。
2、检查客户端与目标节点的iptables/firewalld规则,例如执行
和
,确保对应端口已放行。
3、若集群部署于云环境,同步核查安全组(Security Group)是否允许源IP访问目标端口。
三、核对/etc/hosts与DNS解析一致性
当Spark组件通过主机名通信时,若
中主机名映射到错误IP、本地回环地址(127.0.0.1)或存在多条记录导致解析歧义,NodeManager或ApplicationMaster可能尝试连接一个不可达的地址,从而返回Connection refused。
1、在所有集群节点检查
文件,确保每个主机名仅对应一个有效内网IP,且无重复或注释残留条目。
2、执行
获取FQDN,再运行
或
,确认解析结果与
中配置完全一致。
3、若使用YARN Client模式,需额外检查
配置值是否为可被集群节点路由的真实IP,
严禁设为127.0.0.1或localhost
。
四、确认HDFS或外部存储服务端口配置匹配
当Spark任务依赖HDFS、OSS或Doris等外部存储时,“Connection refused”常源于Spark配置中使用的存储端口与后端服务实际监听端口不一致,例如HDFS core-site.xml中配置
,而Spark eventLog目录却指向
。
1、比对Hadoop
中的
值与Spark
中
、
等配置所含端口号是否一致。
2、登录HDFS NameNode WebUI(通常为
),查看“Utilities → Browse the file system”功能是否可用,间接验证NameNode服务状态及端口暴露情况。
3、若使用HDFS高可用(HA)模式,确认Spark配置中使用的是逻辑URI(如
)且
中
与
等参数已正确定义。
五、排查Spark UI端口冲突导致的绑定失败连锁反应
部分场景下,Spark Driver因UI端口被占而连续重试绑定,最终虽未报明确UI错误,但其内部RPC服务初始化失败,进而影响ApplicationMaster与Driver之间的注册通信,表现为“Failed to connect to driver”并伴随Connection refused。
1、检查Driver日志中是否出现
类似条目。
2、定位当前被占用的端口范围,通过
(默认起始端口)至
确认是否有残留Java进程占用。
3、在提交任务时显式指定UI端口,例如添加
,或扩大重试上限:
,
避免因UI绑定失败引发下游通信中断
。
netstat -tuln | grep :7077netstat -tuln | grep :8080ps -ef | grep sparkspark.masterspark://node02:7077127.0.0.1:70770.0.0.0:7077telnet node02 7077nc -zv node02 7077sudo systemctl status firewalldsudo firewall-cmd --list-all/etc/hosts/etc/hostshostname -fnslookup $(hostname -f)ping -c 1 $(hostname -f)/etc/hostsspark.driver.hostfs.defaultFS=hdfs://master:9000hdfs://master:8020core-site.xmlfs.defaultFSspark-defaults.confspark.eventLog.dirspark.history.fs.logDirectoryhttp://namenode:9870hdfs://myclusterhdfs-site.xmldfs.nameservicesdfs.ha.namenodes.myclusterERROR SparkUI: Failed to bind SparkUI java.net.BindException: Address already in uselsof -i :4040lsof -i :4055--conf spark.ui.port=4060--conf spark.port.maxRetries=128