在 Zeppein 停止后,Zeppelin 在 Yarn 集群模式下启动的 Spark (Yarn) 应用程序不会被杀死

Spark (Yarn) applications started by Zeppelin in Yarn Cluster Mode aren't killed after zeppein is stopped

我是 运行 Zeppelin 0.8.1 并已将其配置为将 Spark 作业提交到 Yarn 2.7.5 集群,解释器都处于集群模式(因为在 AM 中是 运行 在 yarn 上,而不是在驱动程序主机上),并在客户端模式下。

在我停止 Zeppelin 服务器后,以客户端模式启动的 yarn 应用程序立即被杀死。但是,以集群模式启动的作业变得像僵尸一样,并开始占用 Yarn 集群中的所有资源(没有动态资源分配)。

有没有办法让 zeppelin 在退出时杀死这些作业?或者有什么办法可以解决这个问题?

从0.8版本开始,Zeppelin提供了关闭空闲解释器的参数,通过设置zeppelin.interpreter.lifecyclemanager.timeout.threshold.

Interpreter Lifecycle Management

在此之前,我使用了一个简单的 shell 脚本来检查 yarn 上的 运行 应用程序,如果闲置超过 1 小时则将其杀死:

max_life_in_mins=60

zeppelinApps=`yarn application -list 2>/dev/null | grep "RUNNING" | grep "Zeppelin Spark Interpreter" | awk '{print }'`

for jobId in $zeppelinApps
do
    finish_time=`yarn application -status $jobId 2>/dev/null | grep "Finish-Time" | awk '{print $NF}'`
    if [ $finish_time -ne 0 ]; then
      echo "App $jobId is not running"
      exit 1
    fi

    time_diff=`date +%s`-`yarn application -status $jobId 2>/dev/null | grep "Start-Time" | awk '{print $NF}' | sed 's!$!/1000!'`
    time_diff_in_mins=`echo "("$time_diff")/60" | bc`

    if [ $time_diff_in_mins -gt $max_life_in_mins ]; then
      echo "Killing app $jobId"
      yarn application -kill $jobId
    fi
done 

还有yarnREST API做同样的事情