运行Spark Streaming单词计数程序时遭遇java.net.ConnectException错误
解决Spark Streaming连接localhost:9999被拒绝的问题
这个Connection refused错误太常见了,本质就是你的Spark Receiver压根连不上你启动的nc服务,我给你捋几个排查和解决的步骤,按顺序来基本能搞定:
先确认nc服务真的在正常运行
别光盯着命令行输入了nc -lk 9999就以为万事大吉,先检查进程:
- Linux/macOS:在终端跑
ps aux | grep nc,看看输出里有没有nc -lk 9999这条进程。如果没有,说明nc启动失败了,重新执行命令试试。 - Windows:打开任务管理器,找
nc.exe进程,或者用命令tasklist | findstr nc。另外注意,Windows下很多nc版本不支持-lk组合参数,得改成nc -l -p 9999才能正常监听端口。
验证9999端口确实在被监听
有时候nc看起来启动了,但其实没真正监听端口,这时候用端口检查命令确认:
- Linux/macOS:执行
ss -tulpn | grep 9999,看输出里有没有LISTEN状态的记录,地址是0.0.0.0或者127.0.0.1都可以。 - Windows:跑
netstat -ano | findstr :9999,找状态为LISTENING的行,对应的PID要和nc进程的PID一致。
核对Spark代码里的连接参数
检查你的代码中,创建socket流的那一行是不是写对了:
// 确保地址和端口和nc完全匹配 val lines = ssc.socketTextStream("localhost", 9999)
要是你的Spark是分布式集群,localhost指的是Worker节点的本地,这时候你得把nc启动在对应的Worker节点上,或者把代码里的地址改成nc所在机器的内网/公网IP,不能再用localhost了。
排查防火墙/安全组拦截
如果nc和Spark不在同一台机器,一定要检查两台机器的防火墙有没有开放9999端口,云服务器的话还要看安全组规则是不是允许9999端口的入站流量。就算是同一台机器,Windows防火墙或者Linux的ufw/iptables也可能拦截本地连接,临时关闭防火墙测试一下,能连上的话再去配置规则放行端口。
正确的操作流程示例
给你一个不会出错的步骤:
- 打开第一个终端,启动nc服务:
# Linux/macOS用这个 nc -lk 9999 # Windows用这个(如果上面的参数不行) nc -l -p 9999 - 保持这个终端打开,别关闭!然后打开第二个终端,运行你的Spark Streaming程序。
- 回到第一个终端,输入一些测试文本,比如
hello world hello spark,看看Spark程序能不能正常接收并统计单词。
额外提醒
- 一定要先启动nc,再运行Spark程序,不然Receiver会一直重试连接,虽然之后启动nc也能连上,但先启动nc更稳妥。
- 有些老旧的nc版本不支持
-k参数(这个参数是用来保持连接不关闭的),如果启动nc后,第一次连接断开就退出了,那后面的连接也会失败。这种情况建议换成nmap的ncat,命令是ncat -lk 9999,功能更稳定。
内容的提问来源于stack exchange,提问作者user9469158
相关产品推荐
相关产品推荐

