如何使用spark-submit可靠地杀死提交的spark应用程序

时间:2015-11-21 02:49:50

标签: linux bash apache-spark

我看到一个奇怪的问题。我在独立模式下有一个火花簇。我从远程节点提交了火花作业,如下所示

$> 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以便我可以远程监控它

感谢您的帮助

3 个答案:

答案 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