Spark Slave systemd守护进程启动失败问题排查求助
看起来你遇到的是一个systemd管理Spark服务的常见坑:从状态信息看start-slave.sh脚本确实执行成功了,但服务很快就标记为inactive (dead)。这是因为start-slave.sh本身是个启动后台进程后就会退出的脚本——它的任务是拉起Spark Worker的后台进程,完成后自己就终止了,而systemd默认会监控ExecStart指定的主进程,当这个脚本进程结束时,systemd就会认为服务已经结束,哪怕真正的Worker进程还在后台跑着。
下面给你两种可靠的解决办法:
方案1:直接启动Spark Worker的Java进程(推荐)
与其让systemd监控临时的启动脚本,不如直接让它监控真正的Spark Worker进程。修改你的sparkslave.service配置文件如下:
[Unit] Description=Spark Slave After=network.target [Service] User=spark-user WorkingDirectory=/usr/lib/spark ExecStart=/usr/lib/spark/bin/spark-class org.apache.spark.deploy.worker.Worker spark://172.16.3.90:7077 Restart=on-failure RestartSec=10s KillMode=process Type=forking [Install] WantedBy=multi-user.target
修改完成后,执行以下命令重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart sparkslave.service
方案2:让start-slave.sh保持前台运行
如果你更习惯用Spark自带的启动脚本,可以尝试让它不后台启动Worker进程。大部分新版本的Spark支持--no-daemon参数,修改ExecStart行如下:
ExecStart=/usr/lib/spark/sbin/start-slave.sh --no-daemon spark://172.16.3.90:7077
如果你的Spark版本比较旧,没有--no-daemon参数,那就手动编辑/usr/lib/spark/sbin/start-slave.sh脚本,找到启动Worker的那一行(通常会有一个&符号让进程后台运行),去掉那个&,让Worker进程在前台运行。
之后同样执行daemon-reload和restart命令生效。
验证服务状态
修改后,用sudo systemctl status sparkslave.service查看状态,如果显示active (running),再去Spark Master的Web UI(默认端口8080)确认Slave节点是否已经注册成功。另外,也可以查看Spark的日志文件/usr/lib/spark/logs/spark-spark-user-org.apache.spark.deploy.worker.Worker-1-SparkSlave1.out,排查是否有其他启动异常。
内容的提问来源于stack exchange,提问作者Ali

