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 中完成一个进程后,有啥方法可以运行单独的笔记本?