当你执行 stop-all.sh 后,Worker节点仍然显示 alive 状态,这通常由以下几个原因引起:
常见原因及解决方案:
1. 进程未完全终止
# 在Worker节点上检查是否有残留进程
ps aux | grep -i spark | grep -v grep
# 强制终止所有Spark相关进程
pkill -f spark
2. 网络通信延迟
- Master和Worker之间的心跳检测可能需要时间更新状态
- 等待1-2分钟再检查状态
# 查看Master Web UI(默认8080端口)
# 或者通过spark-shell检查
3. Worker节点有活跃任务
如果Worker正在运行任务,它会延迟停止:
# 查看是否有正在运行的任务
${SPARK_HOME}/bin/spark-submit --master spark://<master>:7077 --class ...
# 或通过Web UI查看任务状态
4. 手动清理方法
方法一:逐一停止Worker
# 在每个Worker节点上执行
${SPARK_HOME}/sbin/stop-worker.sh
# 或使用脚本停止特定Worker
${SPARK_HOME}/sbin/stop-worker.sh spark://<master>:7077
方法二:使用jps和kill
# 查看Java进程
jps
# 找到Worker进程ID
# 正常停止
kill <worker_pid>
# 强制停止(如果正常停止无效)
kill -9 <worker_pid>
方法三:批量清理脚本
#!/bin/bash
# cleanup_spark.sh
# 停止所有Spark相关进程
pkill -f "spark.*Worker"
pkill -f "spark.*Master"
# 清理临时文件(可选)
rm -rf /tmp/spark-*
5. 检查配置文件问题
# 检查Worker配置文件
cat ${SPARK_HOME}/conf/spark-env.sh
# 确保SPARK_WORKER_PID和SPARK_WORKER_DIR配置正确
export SPARK_WORKER_PID=/tmp/spark-worker.pid
6. 防火墙/网络问题
# 检查端口是否释放
netstat -tlnp | grep 8080 # Worker Web UI
netstat -tlnp | grep 7077 # Master端口
推荐的完整清理流程:
# 1. 在主节点再次尝试停止
${SPARK_HOME}/sbin/stop-all.sh
# 2. 等待30秒后检查
sleep 30
# 3. 在所有节点检查残留进程
for node in node1 node2 node3; do
ssh $node "jps | grep -E 'Worker|Master'"
done
# 4. 如果有残留,强制清理
for node in node1 node2 node3; do
ssh $node "pkill -f 'spark.*(Worker|Master)'"
done
# 5. 清理临时目录
for node in node1 node2 node3; do
ssh $node "rm -rf /tmp/spark-* /tmp/hsperfdata_*"
done
预防措施:
- 在停止前先停止所有应用:
${SPARK_HOME}/bin/spark-class org.apache.spark.deploy.Client kill
- 使用更可靠的停止方式:
# 使用start/stop脚本时指定具体节点
${SPARK_HOME}/sbin/stop-slave.sh # 停止Worker
${SPARK_HOME}/sbin/stop-master.sh # 停止Master
- 配置合适的超时时间(在spark-defaults.conf中):
spark.worker.timeout 60
spark.master.retainedApplications 50
如果问题仍然存在,请检查:
- Spark日志:
${SPARK_HOME}/logs/ - 系统日志:
/var/log/messages或journalctl -u spark - 确认使用的是相同用户启动和停止集群