当前位置: 首页 > article >正文

hive 自动检测、自动重启、记录检测日志、自动清理日志

最终效果

  • 定时检测hive运行状态,进程不存在或者进程存在但是不监听端口的hiveserver2,自动重新拉起
  • 每次检测脚本执行的日志都会保存在log目录下.check文件,每一个月一个文件
  • 每月15日,删除2月前的检测日志
  • 开启hive自带日志输出后,日志不会删除,且较大,因此一并将过期的hive自带日志清空

https://blog.csdn.net/Brother_ning/article/details/127993943
从这个作者复制的,但是他的代码好像有点问题,修改后然后加以优化

定时检查脚本

vi $HIVE_HOME/hiveservice.sh

#!/bin/bash

HIVE_LOG_DIR=$HIVE_HOME/log
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# 日志清理,如果与hive默认日志命名风格一样,也会自动清理hive的日志
DT=$(date)
DT_2M=$(date -d "2 month ago")
CHECK_LOG=$HIVE_LOG_DIR/hive.log.$(date "+%Y-%m").check
CHECK_LOG_REG=$HIVE_LOG_DIR/hive.log.$(date -d "2 month ago" +"%Y-%m")-*
METASTORE_PORT=9083
HIVESERVER2_PORT=10000
# 最大连接数,超过这个数,则重启hive
MAX_WORKS=1800
if [ ! -d $HIVE_LOG_DIR ]
then
    mkdir -p $HIVE_LOG_DIR
fi

check_process(){
    WORKS=$(netstat -anltp|grep $HIVESERVER2_PORT|wc -l)
    if [ "$WORKS" -gt $MAX_WORKS ]; then
        echo "$CURRENT_TIME:链接数异常,重启hive" | tee -a $CHECK_LOG
        hive_stop
        sleep 5
    fi
    pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
    ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
    if [ -n "$pid" ] && [ -n "$ppid" ] && [ "$pid" = "$ppid" ]; then
        echo $pid
        return 0 # 进程正在运行
    else
        return 1 # 进程未运行
    fi
}


hive_stop()
{
    metapid=$(check_process HiveMetastore $METASTORE_PORT)
    if [ -n "$metapid" ]; then
        echo "$CURRENT_TIME:关闭Metastore进程" | tee -a $CHECK_LOG & kill -9 $metapid
    fi
    server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)
    if [ -n "$server2pid" ]; then
        echo "$CURRENT_TIME:关闭server2进程" | tee -a $CHECK_LOG & kill -9 $server2pid
    fi
}

# wait方法不能随意使用,必须在启动执行后才能执行。
wait_start()
{
    local max_retries=100  # 设置最大重试次数 100次,重启时间200秒,如果200秒内没有启动成功,则认为启动失败。
    local retries=0       # 初始化重试计数器

    metapid=$(check_process HiveMetastore $METASTORE_PORT)
    server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)

    while { [ -z "$metapid" ] || [ -z "$server2pid" ]; } && [ $retries -lt $max_retries ]; do
        sleep 2
        echo "$(date +"%Y-%m-%d %H:%M:%S"):启动中($retries)。。。" | tee -a $CHECK_LOG
        metapid=$(check_process HiveMetastore $METASTORE_PORT)
        server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)
        retries=$((retries + 1))
    done

    # 检查是否达到最大重试次数
    if [ $retries -ge $max_retries ]; then
        echo "$CURRENT_TIME:达到最大重试次数,启动失败" | tee -a $CHECK_LOG
        exit 1  # 退出脚本,表示启动失败
    else
        echo "$CURRENT_TIME:HIVE状态正常" | tee -a $CHECK_LOG
    fi
}

kill_valid()
{
    PIDS=$(jps -m | grep $1 | awk '{print$1}')
    # 遍历所有PID并使用kill -9命令杀掉它们,防止hive挂掉,但是进程不退出
    for PID in $PIDS; do
        kill -9 $PID
        echo "$CURRENT_TIME:kill无效的$1进程 $PID" | tee -a $CHECK_LOG
        sleep 3
    done
}

hive_start()
{
    metapid=$(check_process HiveMetastore $METASTORE_PORT)
    if [ -z "$metapid" ]; then
        kill_valid HiveMetaStore
        echo "$CURRENT_TIME:Metastore启动中" | tee -a $CHECK_LOG
        nohup hive --service metastore 2>$HIVE_LOG_DIR/metastore.log 1>/dev/null &
    fi
    server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)
    if [ -z "$server2pid" ]; then
        kill_valid HiveServer2
        echo "$CURRENT_TIME:HiveServer2启动中" | tee -a $CHECK_LOG
        nohup hive --service hiveserver2 2>$HIVE_LOG_DIR/hiveServer2.log 1>/dev/null &
    fi
}

status()
{
    metapid=$(check_process HiveMetastore $METASTORE_PORT)
    server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)

    if [ -n "$metapid" ] && [ -n "$server2pid" ]; then
        echo "$CURRENT_TIME:HIVE状态正常" | tee -a $CHECK_LOG
    else
        if [ -z "$metapid" ]; then
            echo "$CURRENT_TIME:Metastore未运行" | tee -a $CHECK_LOG
        fi
        if [ -z "$server2pid" ]; then
            echo "$CURRENT_TIME:HiveServer2未运行" | tee -a $CHECK_LOG
        fi
    fi
}

clean()
{
    echo "$CURRENT_TIME:清空日志 rm -rf $CHECK_LOG_REG" | tee -a $CHECK_LOG
    rm -rf $CHECK_LOG_REG
}


case $1 in
"start")
    hive_start
    wait_start
    ;;
"stop")
    hive_stop
    status
    ;;
"restart")
    hive_stop
    sleep 3
    hive_start
    wait_start
    ;;
"status")
    status
    ;;
"clean")
    clean
    ;;
*)
    echo Invalid Args!
    echo 'Usage: '$(basename $0)' start|stop|restart|status|clean'
    ;;
esac

定时调度

crontab -e
输入如下内容,注意修改环境变量,cron无法正常读取系统环境变量

#设置 HIVE_HOME 环境变量
HIVE_HOME=/data/soft/hive-3.1.2
# 每隔10分钟执行一次状态检测,有问题自动重启
*/10 * * * * sh $HIVE_HOME/hiveservice.sh start
# 每周天在0点01分执行一次 restart 任务
1 0 * * 0 sh $HIVE_HOME/hiveservice.sh restart >> $HIVE_HOME/log/cron.restart.log
# 每月15号清空2月前的hive日志
0 0 15 * * sh $HIVE_HOME/hiveservice.sh clean

crontab -l
检查crontab运行任务
tail -f /var/log/cron (centos)
cat /var/log/syslog (乌班图)


http://www.kler.cn/a/515014.html

相关文章:

  • Debian 上安装PHP
  • 如何实现网页不用刷新也能更新
  • nvm版本安装
  • Java如何向http/https接口发出请求
  • 【Mac】Python相关知识经验
  • windows git bash 使用zsh 并集成 oh my zsh
  • 《Java核心技术 卷II》获取Web数据提交表单数据
  • PIC单片机HEX文件格式分析
  • 人工智能学习(三)之机器学习基本概念
  • Oracle 深入学习 Part 13: Maintaining Data Integrity(数据完整性维护)
  • 如何使用 findIndex() 方法查找数组中的第一个匹配元素的索引?
  • 国产编辑器EverEdit - 快捷目录
  • 盲道人行道分割YOLOV8SEG
  • 期刊论文左下角添加通讯作者和横线的方法
  • GeoJSON 数据
  • 人源化抗体的改造方式及其优势【卡梅德生物】
  • 可以免费使用的电子杂志制作平台
  • OFD、PDF 电子签章系统处理流程
  • 大模型GUI系列论文阅读 DAY3:《GPT-4V(ision) is a Generalist Web Agent, if Grounded》
  • matlab绘图——彩色螺旋图
  • 数据结构——实验六·散列表
  • Android SystemUI——通知栏构建流程(十六)
  • GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比
  • Java菜鸟养成计划(java基础)--- java中的变量
  • C语言--数据在内存中的存储
  • Android中关于View的几种属性赋值方式