【问题标题】:How to kill spark applications submitted using spark-submit reliably如何可靠地杀死使用 spark-submit 提交的 spark 应用程序
【发布时间】:2020-07-31 23:52:38
【问题描述】:

我看到一个奇怪的问题。我有一个独立模式的火花集群。我从终端提交来自远程节点的火花作业,如下所示

$> spark-submit --master spark://10.1.40.18:7077  --class com.test.Ping spark-jobs.jar

当应用程序运行时,当我在控制台终端上按 ctrl-C 时,进程被终止,火花主 UI 中的应用程序也是如此。当我去 spark master ui 时,我看到这个应用程序在 Completed applications 下处于 Killed 状态,这是我期望看到的。

现在,我创建了一个如下的 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 中被终止,但我仍然看到在我的机器上运行的进程。

在这两种情况下,我都希望远程 spark 应用程序被终止,而我的本地进程也被终止。

为什么会这样?以及如何从通过 shell 脚本启动的终端终止 spark 应用程序,而无需进入 spark 主 UI?

我想通过脚本启动 spark 应用程序并记录 pid,以便我可以远程监控它

感谢您的帮助

【问题讨论】:

  • 您正在后台运行 spark-submit(即 spark-submit 命令末尾的 &)。这将 spark 提交程序与您的 shell 脚本分离。要终止程序,您可以执行类似“ps ax | grep spark-jobs.jar | awk 'print $1' | read spark_submit_pid; kill spark_submit_pid”之类的操作。基本上列出进程,使用您的 spark 应用程序找到一个,打印第一列 (pid),使用 pid 终止。

标签: linux bash apache-spark


【解决方案1】:

我通过在代码中添加关闭挂钩解决了第一个问题。退出脚本时会调用关闭挂钩(ctrl-C,kill … 但也不是 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 停止时线程池已关闭

希望对你有帮助

【讨论】:

【解决方案2】:

使用spark杀死任务的方法是:

park-submit --kill [submission ID] --master [spark://...]

【讨论】:

  • 和正确的方法来获得可能的 PID pidof spark-submit 回显到 /var/run/spark-submit.pid 然后用 kill -9 $(cat /var/run/spark-submit.pid) && rm /var/run/spark-submit.pid || echo "$(pidof spark-submit)" >/var/run/spark-submit.pid 杀死
【解决方案3】:

当我想终止在集群模式下运行的特定 SPARK 作业并使用新版本的应用程序我想再次启动它时,这是我遵循的方法,所以处理这个以编程方式是最好的方法。

我按照两个 shell 脚本来stopstart

start.sh 类似于我们都知道的 spark-submit 脚本

另一个是stop.sh,代码如下。

我首先调用 stop.sh,然后调用 start.sh(通过 CI/CD),这取决于您如何自动化端到端部署。

根据 spark-submit“名称”参数中描述的名称,这段代码将终止特定作业(如果正在运行)。

为了更安全,我建议修剪任何前导或尾随空格。 在运行 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

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 2017-10-14
    • 1970-01-01
    • 2017-04-16
    • 2020-12-27
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多