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

Posted

技术标签:

【中文标题】zeppein 停止后,Zeppelin 在 Yarn Cluster 模式下启动的 Spark (Yarn) 应用程序不会被杀死【英文标题】:Spark (Yarn) applications started by Zeppelin in Yarn Cluster Mode aren't killed after zeppein is stopped 【发布时间】:2020-04-22 18:44:08 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

从 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 $1'`

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 

还有纱线REST API做同样的事情。

【讨论】:

问题是,文档说默认超时是 1 小时。但是我们已经让口译员运行了好几天......无论如何,我会尝试一下。非常感谢:) 我试过了,效果很好!谢谢 :) 我不明白为什么我们之前运行了这么多旧解释器......这个解决方案有一个警告:在客户端模式应用程序上,它会停止解释器并且应用程序状态更改为FINEISHED;但在集群模式下,它会停止驱动程序和解释器,这反过来又会使 AM 尝试重新连接到驱动程序,从而创建一个新的attempt。反过来,连接被拒绝,并导致应用程序状态更改为FAILED。因此,尽管解决了问题,但这会弄乱日志。

以上是关于zeppein 停止后,Zeppelin 在 Yarn Cluster 模式下启动的 Spark (Yarn) 应用程序不会被杀死的主要内容,如果未能解决你的问题,请参考以下文章

Zeppelin:如何在 zeppelin 中重新启动 sparkContext

Kubernetes 上的 Zeppelin Spark Master 设置

Apache Zeppelin + Spark 的按需用户集群?

在 zeppelin 中完成一个进程后,有啥方法可以运行单独的笔记本?

Apache Zeppelin:每个页面都需要几分钟才能加载

Zeppelin 错误:部署到 Kubernetes 集群后出现“解释器进程未运行”