一、引言
在大数据开发中,Hive 作为重要的数据仓库工具,其核心服务metastore
(元数据服务)和hiveserver2
(查询服务)的启停管理是日常运维的基础操作。手动执行命令启停服务不仅效率低下,还容易因操作遗漏导致服务状态不一致。本文将介绍一个自主开发的 Hive 服务控制脚本,实现对两大核心服务的一键启停、状态查询及日志管理,大幅提升运维效率。
二、脚本核心功能与架构设计
2.1 核心功能
多模式操作 :支持start
(启动)、stop
(停止)、status
(状态查询)三种操作模式
单 / 批量控制 :可单独指定服务(metastore
或hiveserver2
)或批量操作所有服务
智能校验:自动检测服务状态,避免重复启停
日志管理:自动创建日志目录,将服务输出重定向到独立日志文件
友好交互:提供详细帮助信息和状态反馈
2.2 架构设计
#!/bin/bash
op=$1 # 操作类型(start/stop/status)
server=$2 # 目标服务(metastore/hiveserver2,可选)
# 核心模块:
# 1. 参数校验与帮助信息(help_info函数)
# 2. 进程状态查询(ps命令获取PID)
# 3. 日志目录创建(/var/log/my_hive_log)
# 4. 服务控制函数(启动/停止/状态查询)
# 5. 主逻辑调度(根据参数执行对应操作)
三、脚本代码与关键逻辑详解
3.1 完整脚本代码
#!/bin/bash
# Hive服务控制脚本,支持metastore/hiveserver2一键管理
# 使用方式: hive-server-manager.sh [start|stop|status] [metastore|hiveserver2]
help_info() {
echo "+---------------------------------------------------------------------------------+"
echo "| Hive服务管理脚本 - 支持metastore/hiveserver2控制 |"
echo "| 用法: $0 {start|stop|status} [metastore|hiveserver2] |"
echo "+---------------------------------------------------------------------------------+"
echo "| 操作命令: start(启动) | stop(停止) | status(状态) |"
echo "| 目标服务: metastore(元数据服务) | hiveserver2(查询服务),默认操作所有服务 |"
echo "+---------------------------------------------------------------------------------+"
exit -1
}
# 参数校验
op=$1
server=$2
[ -z "$op" ] || [ "$op" != "start" -a "$op" != "stop" -a "$op" != "status" ] && help_info
# 进程查询
metastore_pid=$(ps aux | grep 'org.apache.hadoop.hive.metastore.HiveMetaStore' | grep -v grep | awk '{print $2}')
hiveserver2_pid=$(ps aux | grep 'hiveserver2' | grep -v grep | awk '{print $2}')
# 日志目录管理
log_dir="/var/log/my_hive_log"
[ ! -d "$log_dir" ] && mkdir -p "$log_dir"
# 启动函数
start_metastore() {
[ -n "$metastore_pid" ] && echo "metastore已运行,PID: $metastore_pid" && return
nohup hive --service metastore >> "$log_dir/metastore.log" 2>&1 &
echo "metastore启动成功,日志路径:$log_dir/metastore.log"
}
start_hiveserver2() {
[ -n "$hiveserver2_pid" ] && echo "hiveserver2已运行,PID: $hiveserver2_pid" && return
nohup hive --service hiveserver2 >> "$log_dir/hiveserver2.log" 2>&1 &
echo "hiveserver2启动成功,日志路径:$log_dir/hiveserver2.log"
}
# 停止函数
stop_metastore() {
[ -n "$metastore_pid" ] && kill -9 "$metastore_pid"
echo "metastore服务已停止"
}
stop_hiveserver2() {
[ -n "$hiveserver2_pid" ] && kill -9 "$hiveserver2_pid"
echo "hiveserver2服务已停止"
}
# 状态查询函数
status_metastore() {
echo "metastore状态:$(if [ -n "$metastore_pid" ]; then echo "运行中,PID: $metastore_pid"; else echo "未运行"; fi)"
}
status_hiveserver2() {
echo "hiveserver2状态:$(if [ -n "$hiveserver2_pid" ]; then echo "运行中,PID: $hiveserver2_pid"; else echo "未运行"; fi)"
}
# 主逻辑调度
if [ -n "$server" ]; then
case "$server" in
metastore) "${op}_metastore" ;;
hiveserver2) "${op}_hiveserver2" ;;
*) echo "错误:未知服务 $server" && help_info ;;
esac
else
"${op}_metastore"
"${op}_hiveserver2"
fi
3.2 关键逻辑解析
3.2.1 参数校验与帮助信息
[ -z "$op" ] || [ "$op" != "start" -a "$op" != "stop" -a "$op" != "status" ] && help_info
严格校验首个参数是否为合法操作(start/stop/status)
非法参数或参数缺失时,调用help_info
函数输出详细使用说明
3.2.2 进程状态查询
metastore_pid=$(ps aux | grep 'org.apache.hadoop.hive.metastore.HiveMetaStore' | grep -v grep | awk '{print $2}')
通过ps
命令结合进程关键字精准匹配服务进程
grep -v grep
过滤掉自身查询进程,确保结果准确
3.2.3 日志管理机制
log_dir="/var/log/my_hive_log"
[ ! -d "$log_dir" ] && mkdir -p "$log_dir"
自动创建日志目录/var/log/my_hive_log
服务输出通过nohup
重定向到独立日志文件,避免终端关闭导致进程终止
3.2.4 服务控制函数
start_metastore() {
[ -n "$metastore_pid" ] && echo "已运行" && return # 避免重复启动
nohup hive --service metastore >>日志文件 & # 后台运行
}
启动前先检查进程状态,防止重复启动
停止时使用kill -9
强制终止(生产环境建议改用kill
优雅终止)
四、部署与使用指南
4.1 部署步骤
# 1. 保存脚本
wget https://example.com/hive-service-manager.sh # 或手动创建
vi hive-service-manager.sh # 粘贴脚本内容
# 2. 移动到系统路径并赋予权限
sudo mv hive-service-manager.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/hive-service-manager.sh
4.2 操作示例
4.2.1 批量操作
# 启动所有服务
hive-service-manager.sh start
# 停止所有服务
hive-service-manager.sh stop
# 查看所有服务状态
hive-service-manager.sh status
4.2.2 单服务操作
# 单独启动metastore
hive-service-manager.sh start metastore
# 单独停止hiveserver2
hive-service-manager.sh stop hiveserver2
# 查看hiveserver2状态
hive-service-manager.sh status hiveserver2
4.2.3 输出示例
# 启动成功
metastore启动成功,日志路径:/var/log/my_hive_log/metastore.log
hiveserver2已运行,PID: 12345,已跳过
# 状态查询
metastore状态:运行中,PID: 67890
hiveserver2状态:未运行
五、生产环境优化建议
5.1 优雅停止服务
# 修改停止函数,使用正常终止信号
stop_metastore() {
[ -n "$metastore_pid" ] && kill "$metastore_pid" # 替换kill -9
echo "metastore服务已停止"
}
使用kill
(默认发送 SIGTERM 信号)允许服务完成当前操作再终止
避免kill -9
强制终止可能导致的元数据不一致
5.2 端口健康检查
# 增加端口检测函数(示例)
check_port() {
local port=$1
nc -z localhost "$port" &>/dev/null
[ $? -eq 0 ] && echo "端口$port可用" || echo "端口$port不可用"
}
# 在状态查询中调用
status_metastore() {
local pid=$metastore_pid
[ -n "$pid" ] && check_port 9083 || echo "metastore未运行"
}
metastore 默认端口:9083
hiveserver2 默认端口:10000
通过端口检测增强状态判断的准确性
5.3 日志清理策略
# 添加日志清理脚本(建议每周执行)
find /var/log/my_hive_log -type f -mtime +7 -exec rm {} \;