文章目录

  • 1.创建shell监控脚本flink_log_monitor.sh
  • 2.设置钉钉智能机器人
  • 3.crontab执行脚本
  • 4.mysql存放日志INFO
  • 5.钉钉告警


1.创建shell监控脚本flink_log_monitor.sh

#!/bin/bash

now=`date '+%Y-%m-%d %H:%M:%S'`


# 传入要遍历的目录
root_dir="$1"

# 初始化监控文件,通过getdir方法得到
monitor_file=


# 错误记录到mysql
function error_storage(){
/usr/bin/mysql -uXXX -pXXX -h XXX -P 3306 -e \
"use hadoop;
CREATE TABLE IF NOT EXISTS hadoop.FLINK_LOG_MONITOR(
    YARN_JOB_NAME VARCHAR(255) COMMENT 'FLINK ON YARN JOB名称',
    YARN_ID VARCHAR(255) COMMENT 'FLINK ON YARN ID',
    HOST_NAME VARCHAR(255) COMMENT '日志产生的HOST',
    ERROR_LOG_DIR VARCHAR(255) COMMENT 'ERROR日志目录',
    ERROR_TIMES INT(11) DEFAULT 0 COMMENT '日志中ERROR次数',
    CREATE_TIME DATETIME DEFAULT NULL COMMENT '日志时间',
    PRIMARY KEY (YARN_JOB_NAME,HOST_NAME,ERROR_LOG_DIR)
)ENGINE = INNODB  DEFAULT CHARSET = utf8 comment 'YARN APPLICATION 的日志监控';

"
}

# 钉钉告警
# 告警的是日志中新增error次数
function DingDing_Alarm(){
webhook='https://oapi.dingtalk.com/robot/send?access_token=XXXXXX'
curl $webhook -H 'Content-Type: application/json' -d "
    {
        'msgtype': 'text',
        'text': {
            'content': 'FlinkJob On yarn Log Error Alarm\n
YARN_JOB_NAME: [$yarn_job_name]\n
YARN_ID: [$yarn_id]\n
HOST: [$hostname]\n
ERROR_LOG_DIR: [$monitor_file] \n
ERROR_TIMES: [$error_increase]\n
CREATE_TIME: [$now]'
        }
    }"
}


# 错误日志监控
function error_monitor(){

error_times=$(cat $monitor_file | grep 'ERROR' | wc -l)

if [[ $error_times -gt 0 ]];then

  yarn_id=`echo "$monitor_file"|awk -F '/' '{print $6}'`
  yarn_job_name=`$HADOOP_HOME/bin/yarn application -list | grep $yarn_id  | awk '{print $2}'`
  hostname=$HOSTNAME
  
  #只对yarn jobm名中包含flink的任务进行日志监控
  if [[ $yarn_job_name =~ "flink" ]]; then
  
	  error_times_mysql=`/usr/bin/mysql -uXXX -pXXX -h XXX -P 3306 -Bse "
	  select ERROR_TIMES from hadoop.FLINK_LOG_MONITOR WHERE YARN_JOB_NAME='"$yarn_job_name"' AND HOST_NAME='"$hostname"' AND ERROR_LOG_DIR='"$monitor_file"';
	  " | tr -cd '[0-9]' | sed -r 's/0*([0-9])/\1/'`
	  # error_times_mysql为空时,赋值为0
	  para=
	  if [[ $error_times_mysql == $para ]];then
	  error_times_mysql=0
	  fi
	 

	  # 新增error次数
	  error_increase=$(($error_times - $error_times_mysql))

	  if [[ $error_increase -gt 0 ]];then
		 
		 # 错误日志情况	 
		  /usr/bin/mysql -uXXX -pXXX -h XXX  -P 3306 -e \
		 "
		  replace into  hadoop.FLINK_LOG_MONITOR values('"$yarn_job_name"','"$yarn_id"','"$hostname"','"$monitor_file"','"$error_times"','$now');
		 "
		 
		 # 钉钉告警
		  DingDing_Alarm
		   

	   elif [[ $error_increase -lt 0 ]];then
                 echo 'error_increse 小于0'

		 /usr/bin/mysql -uXXX -pXXX -h XXX  -P 3306 -e \
		 "
		  delete from  hadoop.FLINK_LOG_MONITOR WHERE YARN_JOB_NAME='"$yarn_job_name"' AND HOST_NAME='"$hostname" AND ERROR_LOG_DIR='"$monitor_file"'';
		 "
	   fi 
   fi
fi 

}


# 遍历目录下的所有子目录及文件
function getdir(){
    for element in `ls $1`
    do  
        dir_or_file=$1"/"$element
        if [ -d $dir_or_file ]
        then 
            getdir $dir_or_file
        else
			monitor_file=$dir_or_file
			#对每个文件日志进行监控
            error_monitor 
           
        fi  
    done
}

# 初始话数据库
# error_storage

# 执行脚本  ./flink_log_monitor.sh $HADOOP_HOME/logs/userlogs
getdir $root_dir

2.设置钉钉智能机器人

参考 
  shell 操作钉钉机器人实现告警提醒的方法
  https://www.jb51.net/article/186143.htm
  钉钉官网开发文档
  https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

3.crontab执行脚本

此crontab 调用方式会有问题

# 每1小时运行一次
  0 */1 * * * /flink/flinkPro/flink_log_monitor.sh $HADOOP_HOME/logs/userlogs

注意:$HADOOP_HOME/logs/userlogs 目录存放了所有在yarn上运行的应用日志

特别注意: 
    /flink/flinkPro/flink_log_monitor.sh $HADOOP_HOME/logs/userlogs  
    这行脚本可以在linux的shell中直接运行,但是使用crontab调用执行的时候就会找不到$HADOOP_HOME 对应的值. 
    可以在/var/log/cron  或 /var/log/message   或/var/spool/mail/root查看到相应报错日志

正确的crontab 调用方式

(1)将脚本flink_log_monitor.sh 中的所有用到$HADOOP_HOME的,改成具体的本地hadoop路径,如/hadoop/hadoop-2.9.1
(2)另外创建一个脚本flink_monitor.sh
#!/bin/bash	
nohup /flink/flinkMonitor/flink_log_monitor.sh /hadoop/hadoop-2.9.1/logs/userlogs > /flink/flinkMonitor/monitor.log  2>&1 &
(3)再使用crontab 调用
	# 每1小时运行一次
	0 */1 * * * /flink/flinkMonitor/flink_monitor.sh

(4)可以在指定路径/flink/flinkMonitor/monitor.log看到crontab运行日志
tail -200f /flink/flinkMonitor/monitor.log

4.mysql存放日志INFO

yarn怎么设置flink的checkpoint地址 flink on yarn 日志_mysql

YARN_JOB_NAME:  FLINK ON YARN JOB名称
    YARN_ID : FLINK ON YARN ID
    HOST_NAME: 日志产生的HOST
    ERROR_LOG_DIR:   ERROR日志目录
    ERROR_TIMES : 日志中新增ERROR次数,只有新增的ERROR才会发送钉钉告警
    CREATE_TIME: 日志时间

5.钉钉告警

这个是对应Flink Web界面上jobmanager报错日志的linux机器存储目录
	ERROR_LOG_DIR: [/hadoop/hadoop-2.9.1/logs/userlogs/application_1590926337664_5935/container_e84_1590926337664_5935_01_000001/jobmanager.log]

yarn怎么设置flink的checkpoint地址 flink on yarn 日志_mysql_02

可直接 tail -200f 命令查看具体日志信息
 tail -200f hadoop/hadoop-2.9.1/logs/userlogs/application_1590926337664_5935/container_e84_1590926337664_5935_01_000001/jobmanager.log

yarn怎么设置flink的checkpoint地址 flink on yarn 日志_hadoop_03

这个是对应Flink Web界面上taskmanager报错日志的linux机器存储目录
ERROR_LOG_DIR: [/hadoop/hadoop-2.9.1/logs/userlogs/application_1590926337664_5935/container_e84_1590926337664_5935_01_000002/taskmanager.log]

yarn怎么设置flink的checkpoint地址 flink on yarn 日志_mysql_04


yarn怎么设置flink的checkpoint地址 flink on yarn 日志_linux_05