我看到一个奇怪的问题。我在独立模式下有一个火花簇。我从远程节点提交了火花作业,如下所示
$> spark-submit --master spark://10.1.40.18:7077 --class com.test.Ping spark-jobs.jar
当应用程序运行时,当我在控制台终端上按ctrl-C时,该进程将被终止,因此应用程序位于spark master UI中。当我去火花大师ui时,我看到这个应用程序处于已完成的应用程序状态下被杀死,这是我期望看到的。
现在,我按如下方式创建了一个shell脚本来执行相同的操作
#!/bin/bash
spark-submit --master spark://10.1.40.18:7077 --class com.test.Ping spark-jobs.jar &
echo $! > my.pid
当我从终端执行shell脚本时,如下
$> bash myscript.sh
应用程序已正确提交给spark master,我可以将其视为spark master UI中正在运行的应用程序之一。但是当我在终端中杀死进程时如下
$> ps kill $(cat my.pid)
我看到该进程在我的机器上被杀死但是spark应用程序仍然在spark master中运行!它并没有被杀死。
当我通过shell脚本启动spark作业并通过点击" kill"从spark master UI中杀死应用程序时,我注意到了另外一件事。在正在运行的应用程序旁边,它会在spark ui中被杀死,但我仍然看到我的机器中正在运行该进程。
在这两种情况下,我都希望杀死远程火花应用程序并杀死我的本地进程。
为什么会这样?如何从终端launced通过shell脚本杀死一个spark应用程序w.o转到spark master UI?
我想通过脚本启动spark应用程序并记录pid以便我可以远程监控它
感谢您的帮助
答案 0 :(得分:2)
我在代码中添加了一个关闭钩子,解决了第一个问题。当您退出脚本时,关闭钩子会调用(ctrl-C,kill ...但也不能杀死-9)
val shutdownHook = scala.sys.addShutdownHook {
try {
sparkContext.stop()
//Make sure to kill any other threads or thread pool you may be running
}
catch {
case e: Exception =>
{
...
}
}
}
对于另一个问题,请从UI中删除。我也有这个问题。这是由我使用的线程池引起的。
所以我用try / finally块包围我的代码,以保证线程池在spark停止时关闭
我希望这会有所帮助
答案 1 :(得分:1)
使用spark杀死任务的方法是:
park-submit --kill [submission ID] --master [spark://...]
答案 2 :(得分:0)
这是我要杀死正在集群模式下运行的特定 SPARK 作业的方法,我想使用新版本的应用程序再次启动它,因此请对此进行处理以编程方式是最好的方法。
我遵循两个shell脚本来停止和开始。
start.sh 与我们都知道的 spark-submit 脚本
类似另一个是 stop.sh ,下面是代码。
我先调用 stop.sh ,然后再调用 start.sh (通过CI / CD),这取决于您如何自动化端到端部署。
这段代码将根据 spark-submit “ name”参数中所述的名称杀死特定的作业(如果正在运行)。
为了安全起见,我建议修剪任何前导或尾随空格。 在运行SPARK作业的同一群集中执行这些操作。
#!/bin/bash
echo "stop.sh invoked"
export APPLICATION_NAME=my-spark-job-name
echo "Killing $APPLICATION_NAME"
APPLICATION_ID=$(yarn application --appStates RUNNING --list 2>/dev/null | awk "{ if (\$2 == \"$APPLICATION_NAME\") print \$APPLICATION_NAME }")
if ["$APPLICATION_ID" = ""]
then
echo "$APPLICATION_NAME not running."
else
APPLICATION_ID="${APPLICATION_ID#"${APPLICATION_ID%%[![:space:]]*}"}"
APPLICATION_ID="${APPLICATION_ID%"${APPLICATION_ID##*[![:space:]]}"}"
yarn application --kill $APPLICATION_ID 2>/dev/null
echo $APPLICATION_NAME " Successfully Killed!"
fi