目录
一.引言
二.Flink 程序监控
1.shell 脚本
2.crontab 配置
三.Python 程序监控
1.shell 脚本
2.crontab 配置
四.总结
一.引言
业务有流式处理数据的需求,需要 7x24 通过 Flink + Python 程序进行处理。为了监控 Flink 与 Python 的程序运行状态并在程序异常时重启对应程序,开发了对应的流式程序监控脚本。特此记录,供以后类似任务快捷使用。
二.Flink 程序监控
1.shell 脚本
在 linux 机器 vim cron_protect.sh 填入下述信息:
#!/bin/bash
dat=`date +%Y%m%d`
# 任务在 linux 机器的对应目录
base_path='your_path'
cd $base_path
time=`date "+%Y%m%d-%H%M"`
function check() {
# Flinl、Spark Streaming 程序的 appName
appname=$1
appnum=`yarn --config /data0/yarn-streaming application -list | grep $appname| awk '{print $1}'|wc -l`
if [ "$appnum" -eq "1" ];then
echo "$appname $time ok"
elif [ "$appnum" -eq "0" ];then
sh killAndRerun.sh
sendMail
else
echo "任务存在多个实例"
appId=`yarn --config /data0/yarn-streaming application -list | grep $appname| awk '{print $1}'`
arr=(${appId// / })
for i in ${arr[@]}
do
yarn --config /data0/yarn-streaming application -kill $i
echo 'kill' $i
done
sh killAndRerun.sh
sendMail
fi
}
check yourAppName
◆ yarn-streaming 获取当前 AppName 存在的实例数
◆ app_num 判断当前 app_num 分别为 0、1、其他
- 0 代表任务异常,调用启动程序重启服务
- 1 代表任务正常,do nothing
- 其他 存在多个实例,kill 掉全部异常任务,重启对应服务
◆ send_mail 调用告警系统发报警提示任务异常重启
Tips:
不同环境下,yarn-streaming 的命令可能存在差异,上面 yarn-streaming 相关操作请根据自己服务器环境的命令进行修改。如果是 Flink 流程序,也可以在内部调用 env.setRestartStrategy 方法定义对应的重启策略。
2.crontab 配置
0-59/5 * * * * source ~/.bash_profile && cd $base_path && sh cron_protect.sh >> cron.log
这里任务是 7x24 执行,博主设置了 0-59/5 即 5 min 检查一次,也可以根据自己的需求调整 crontab 的频率。运行后,会每 5 min 打印程序运行状态:
三.Python 程序监控
1.shell 脚本
#!/bin/bash
cd $base_path
# 脚本名称
PYTHON_PROGRAM_NAME='your.py'
# 任务 pid
PYTHON_PID=$(pgrep -f $PYTHON_PROGRAM_NAME)
# 检查pid是否存在
if [ -z "$PYTHON_PID" ]; then
# pid不存在,python程序未运行,需要重启
echo "Python程序未运行,正在重启..."
nohup python -u $PYTHON_PROGRAM_NAME >> ./log/log_`date +\%Y\%m\%d`.log 2>&1 &
else
# pid存在,python程序正常运行
echo "Python程序正在运行,pid: $PYTHON_PID"
fi
◆ PYTHON_PROGRAM_NAME 要执行的 python 文件
◆ PYTHON_PID 获取对应 python 程序的 pid
◆ python -u pid 存在不执行,pid 不存在执行 python -u 启动对应任务
Tips:
在Python命令行中,"-u" 选项是指以无缓冲的方式来执行Python脚本。通常情况下,Python 会将输出缓冲,这意味着它会等到有一定数量的数据要输出时才进行输出。这可能会导致输出延迟或者无法实时看到输出结果。当使用 "-u" 选项时,Python 将立即输出结果,而不会缓冲。这在需要实时监控输出结果的情况下非常有用。改参数主要用于解决下述写法不输出日志的问题:
nohup python xxx.py > log 2>&1 &
2.crontab 配置
*/2 * * * * source ~/.bash_profile && cd $base_path && sh cron_protect.sh >> ./log/cron_`date +\%Y\%m\%d`.log 2>&1 &
因为 Flink、Streaming 程序部署在大集群,运行相对稳定所以每 5 min 检查一次,而 python 部署在 linux 机器,容易受机器上其他任务影响,所以 2 min 检查一次。运行后,cron.log 会定时监控 python 程序对应的 pid 是否正常:
四.总结
python 7x24 采用了 While True 的写法,Flink 则是消费了一个 7x24 的 Topic 实现常驻。除此之外,大数据还经常需要监控 Spark 任务的状态,把 yarn-streaming 切换成 yarn 即可。