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 (乌班图)

相关推荐
viperrrrrrrrrr76 小时前
大数据学习(96)-Hive面试题
大数据·hive·学习
麻芝汤圆9 小时前
MapReduce 的广泛应用:从数据处理到智能决策
java·开发语言·前端·hadoop·后端·servlet·mapreduce
随缘而动,随遇而安12 小时前
第四十篇 企业级数据仓库建模深度实践:从理论到落地的维度建模全攻略
大数据·数据库·数据仓库·数据分析·数据库架构
一个天蝎座 白勺 程序猿1 天前
大数据(4.4)Hive多表JOIN终极指南:7大关联类型与性能优化实战解析
hive·hadoop·性能优化
weixin_307779131 天前
判断HiveQL语句为ALTER TABLE语句的识别函数
开发语言·数据仓库·hive·c#
麓殇⊙1 天前
使用注解开发springMVC
数据仓库·hive·hadoop
北随琛烬入2 天前
Spark(10)配置Hadoop集群-集群配置
java·hadoop·spark
蒋星熠2 天前
在VMware下Hadoop分布式集群环境的配置--基于Yarn模式的一个Master节点、两个Slaver(Worker)节点的配置
大数据·linux·hadoop·分布式·ubuntu·docker
SelectDB技术团队2 天前
Apache Doris 2.1.9 版本正式发布
大数据·数据仓库·数据分析·doris·数据湖·湖仓一体·日志数据
啊迷诺斯3 天前
hadoop的常用命令
hadoop