前言
本文主要是围绕spark on yarn cluster模式运行spark应用。在实际应用中,会碰到这种情况,应用被中断、应用未中断但是不执行计算、应用中某些任务失败等。我们将应用部署后,不可能时时都关注,当应用被中断时,怎么能尽快恢复应用的正常运行。我这里采用脚本+服务监控的方式进行维护。
实践
一般情况下,查看应用的运行情况,我的流程:
那么我的脚本+服务监控方式是围绕上述流程图中的yarn application --list开展的。
脚本监控思路:查看yarn application --list中是否有指定的应用,没有就执行重启操作,并记录日志;有则忽略。
脚本示例:
#!/bin/sh
#应用名称
appArr=(app1 app2)
time=$(date "+%Y-%m-%d %H:%M:%S")
#标记变量
t=0
flag=0
#对比$appArr与yarn application --list
for app in ${appArr[@]}
do
for appRun in `yarn application --list`
do
if [ $app = $appRun ]
then
flag=1
#echo "${time} appName($appRun) exists in yarn application list" >> /home/test/sparkMonitor.log
break
fi
done
if [ $flag -eq 0 ]
then
appNotRunArr[t]=$app
t=`expr $t + 1`
else
flag=0
fi
done
#检测没有运行的应用,执行重新启动命令
for appNotRun in ${appNotRunArr[@]}
do
echo "${time} appName($appNotRun) start!" >> /home/test/sparkMonitor.log
# start.sh指的是应用的spark-submit脚本。下述是重启应用,具体根据自己的实际情况
cd /home/test/$appNotRun && ./start.sh
done
服务监控思路:根据yarn的对外接口,查看指定队列的执行状态的SPARK任务:
GET http://<rm http address:port>/ws/v1/cluster/apps?state=RUNNING&applicationType=SPARK &queue=your queue
将获取的结果与自己应运行的所有应用进行对比,将没有运行的应用发短信或邮件通知给负责人。
总结
文中提供的脚本+服务的方式一定程度上可以在应用中断的情况下重新启动,如果应用重启仍然失败的情况下,可以利用服务通知给负责人。至于应用运行中的job、stage、task监控,可以查看spark web ui进行处理。