如何查询本地Apache Spark UI对应的TCP端口?
lsof -p PID失效时查询Spark Shell的UI端口 我懂你遇到的问题了,当你通过jps -lm | grep -i spark能找到Spark进程,但用lsof -p <PID>却查不到UI的TCP端口时,可以试试下面这些靠谱的方法:
1. 先看Spark Shell的控制台日志
Spark Shell启动时,会直接在控制台打印UI的访问地址,找类似这样的行就行:
Spark Web UI available at http://localhost:4040
要是日志滚屏太多看不到,就去Spark默认的日志目录$SPARK_HOME/logs看看——找文件名里包含你Spark进程ID的日志文件,搜索"Spark Web UI available"就能定位到具体端口。
2. 在Spark Shell里直接查询端口
不用依赖外部工具,直接问Spark本身就行!在Scala版本的Spark Shell里,执行这行代码:
sc.uiWebUrl.get
它会返回完整的UI地址(比如http://localhost:4040),里面就有你要找的端口。如果是PySpark,对应的Python命令是:
sc.uiWebUrl
3. 检查Spark的配置文件
Spark UI默认用4040端口,如果这个端口被占用,它会自动尝试4041、4042……直到找到可用的端口。你可以打开$SPARK_HOME/conf/spark-defaults.conf配置文件,看看有没有配置spark.ui.port属性——如果有,那就是默认的起始端口;如果没有,Spark就会从4040开始自动递增。
4. 用netstat或ss命令扫描监听端口
如果上面的方法都不行,直接在系统里找端口就行。用netstat(旧系统)或者ss(现代Linux):
# 使用netstat netstat -tlnp | grep -E ':(404[0-9]+)' # 使用ss ss -tlnp | grep -E ':(404[0-9]+)'
这些命令会列出所有正在监听的TCP端口,404开头的端口基本就是Spark UI的了,输出里还会显示对应的进程ID,能确认是不是你的Spark实例。
至于为什么lsof查不到?有时候Spark UI的端口是由主进程的子线程绑定的,lsof可能没法立刻捕获到——尤其是你刚启动Spark就跑命令的情况。或者你可能需要提升权限(试试在lsof前加sudo)。不管怎样,上面的方法肯定能帮你找到端口。
内容的提问来源于stack exchange,提问作者More Than Five




