[spark]worker节点清理不干净的原因及解决办法

49 阅读1分钟

当你执行 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

预防措施:

  1. 在停止前先停止所有应用
${SPARK_HOME}/bin/spark-class org.apache.spark.deploy.Client kill
  1. 使用更可靠的停止方式
# 使用start/stop脚本时指定具体节点
${SPARK_HOME}/sbin/stop-slave.sh  # 停止Worker
${SPARK_HOME}/sbin/stop-master.sh  # 停止Master
  1. 配置合适的超时时间(在spark-defaults.conf中):
spark.worker.timeout 60
spark.master.retainedApplications 50

如果问题仍然存在,请检查:

  • Spark日志:${SPARK_HOME}/logs/
  • 系统日志:/var/log/messagesjournalctl -u spark
  • 确认使用的是相同用户启动和停止集群