问题描述
我们的flink程序往往是7*24小时在运行的,当任务挂掉后,我们虽然可以通过监控报警等,第一时间知道程序挂掉,但是如果我们电脑不在旁边或者我们在休假,这种情况,往往不能够及时的重启任务。
需求
想实现一个脚本,能够在规定的时间范围内监测到任务已经停止,然后自动运行重启命令,重启任务;如果任务是存有中间状态的,那么还需要在自动重启时获取到任务的checkpoint路径
实现思路
- 关于监测任务是否挂掉
我们可以利用yarn的命令配合Linux的命令行来找到你提交的命令,例如:
yarn application -list| awk ‘{print $2}’ | grep xxxxxx | wc -l
上述命令返回你运行的任务名在yarn上任务列表里的行数,如果是0,那么就证明你的任务挂掉了。
- 关于任务重启
如果你能知道任务挂掉了,那么就可以自动重启了,我们可以在监测到上述命令返回0时,运行你的启动脚本,例如:
if [ $name = 0 ];then
“重启命令”
echo "程序挂掉"
fi
- 关于任务带ck重启
实际生产中,我们的flink往往是带有状态信息的,也就是重启的时候需要指定ck的路径,那么我们这里提供一个简单思路,因为ck的路径是可以在配置中指定的,所以我们只需要知道flink任务的jobId就可以找到对应任务的最新ck,那么我们就可以尝试
①. 在任务启动时保存jobID到文件中,在启动时输出日志:
“>> /logs/test.log”
②.在任务挂掉重启时,先获取之前保存的jobID,然后根据jobID获取路径
jobID=$(cat /logs/test.log)
path="hdfs:///flink/flink-checkpoints/$jobID"
③.重启时,带上ck路径
if [ $name = 0 ];then
jobID=$(cat /logs/test.log)
path="hdfs:///flink/flink-checkpoints/$jobID"
“重启命令”-s $path
echo "程序挂掉"
fi
最后,我们可以写个定时脚本,定时去运行这个命令,这样就可以在指定时间内监测到flink任务挂掉,然后自动重启了。
因为自己的脚本里还有其他东西,所以这里就不方便贴自己的脚本了,只提供一个实现思路,其实还是蛮简单的,如果有问题,欢迎指导交流