跳转到主内容
极星编程网:以代码为星,赴技术山海!

Spark任务报Connection refused是Executor被Kill了吗?

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

相关文章