一、引言
在大數據開發中,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" && returnnohup 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" && returnnohup 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" ]; thencase "$server" inmetastore) "${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 -9echo "metastore服務已停止"
}
使用kill
(默認發送 SIGTERM 信號)允許服務完成當前操作再終止
避免kill -9
強制終止可能導致的元數據不一致
5.2 端口健康檢查
# 增加端口檢測函數(示例)
check_port() {local port=$1nc -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 {} \;