一、脚本解析说明
1、环境变量
保证"HADOOP_HOME" "SPARK_HOME" "$JAVA_HOME" 环境变量配置无误
就可以实现不需要根据虚拟机上的相关安装路径进行脚本变更
2、重点内容
可以根据以下配置进行debug
观察启动(start)、关闭(stop)、校验(check)日志

3、权限控制
注意,根据本专栏的前置文章进行的集群配置,要保证是通过hadoop用户启动的脚本,而不是root用户。
如果不小心用root用户启动了脚本,要先用root用户执行停止。
因为用root用户启动的进程,hadoop用户杀不掉进程
然后再用hadoop用户启动
4、启动命令
sh clusterctl.sh start

也可以再手动验证(这里只在master节点进行验证,node节点也可以验证一下)

5、一键停止集群
sh clusterctl.sh stop

手动验证进程

二、脚本内容
bash
#!/bin/bash
# 集群组件一键启动/关闭脚本(Hadoop/YARN + Hive + Spark)
# 支持参数:start/stop,严格按依赖顺序执行
# 颜色输出定义(增强可读性)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 重置颜色
# 检查环境变量是否存在
check_env() {
local env_list=("HADOOP_HOME" "SPARK_HOME" "JAVA_HOME")
for env in "${env_list[@]}"; do
if [ -z "${!env}" ]; then
echo -e "${RED}错误:环境变量 $env 未配置,请先配置后再执行!${NC}"
exit 1
fi
done
}
# 检查入参合法性
check_args() {
if [ $# -ne 1 ]; then
echo -e "${YELLOW}用法:$0 [start|stop]${NC}"
echo -e "${YELLOW}示例:./clusterctl.sh start (启动所有组件)${NC}"
echo -e "${YELLOW} ./clusterctl.sh stop (关闭所有组件)${NC}"
exit 1
fi
if [ "$1" != "start" ] && [ "$1" != "stop" ]; then
echo -e "${RED}错误:参数只能是 start 或 stop!${NC}"
exit 1
fi
}
# 启动组件函数(带状态检测)
start_component() {
local comp_name=$1
local start_cmd=$2
local check_cmd=$3
echo -e "\n======================================"
echo -e "${YELLOW}正在启动 $comp_name...${NC}"
echo -e "======================================"
# 执行启动命令
eval $start_cmd
local start_exit=$?
# 基础状态判断
if [ $start_exit -ne 0 ]; then
echo -e "${RED}$comp_name 启动命令执行失败!${NC}"
return 1
fi
# 若有检测命令,执行二次验证
if [ -n "$check_cmd" ]; then
sleep 5 # 给服务启动时间
eval $check_cmd > /dev/null 2>&1
local check_exit=$?
echo "检测命令 $check_exit"
if [ $check_exit -eq 0 ]; then
echo -e "${GREEN}$comp_name 启动成功!${NC}"
return 0
else
echo -e "${RED}$comp_name 启动命令执行成功,但服务未正常运行!${NC}"
return 1
fi
else
echo -e "${GREEN}$comp_name 启动命令执行成功!${NC}"
return 0
fi
}
# 关闭组件函数(带状态检测)
stop_component() {
local comp_name=$1
local stop_cmd=$2
local check_cmd=$3
echo -e "\n======================================"
echo -e "${YELLOW}正在关闭 $comp_name...${NC}"
echo -e "======================================"
# 执行关闭命令
eval $stop_cmd
local stop_exit=$?
# 基础状态判断
if [ $stop_exit -ne 0 ]; then
echo -e "${RED}$comp_name 关闭命令执行失败!${NC}"
return 1
fi
# 若有检测命令,执行二次验证
if [ -n "$check_cmd" ]; then
sleep 2 # 给服务关闭时间
eval $check_cmd > /dev/null 2>&1
local check_exit=$?
if [ $check_exit -ne 0 ]; then
echo -e "${GREEN}$comp_name 关闭成功!${NC}"
return 0
else
echo -e "${RED}$comp_name 关闭命令执行成功,但服务仍在运行!${NC}"
return 1
fi
else
echo -e "${GREEN}$comp_name 关闭命令执行成功!${NC}"
return 0
fi
}
# 主执行逻辑
main() {
# 前置检查
check_args "$@"
check_env
local operation=$1
# 组件配置(按依赖顺序)
## Hadoop组件:先启动HDFS,再启动YARN(替代start-all.sh,更精准)
HDFS_START_CMD="$HADOOP_HOME/sbin/start-dfs.sh"
HDFS_STOP_CMD="$HADOOP_HOME/sbin/stop-dfs.sh"
HDFS_CHECK_CMD="jps | grep NameNode"
YARN_START_CMD="$HADOOP_HOME/sbin/start-yarn.sh"
YARN_STOP_CMD="$HADOOP_HOME/sbin/stop-yarn.sh"
YARN_CHECK_CMD="jps | grep ResourceManager"
## Hive组件:Metastore + HiveServer2
HIVE_METASTORE_START_CMD="nohup $HIVE_HOME/bin/hive --service metastore > /tmp/hive/hive_metastore.log 2>&1 &"
#HIVE_METASTORE_STOP_CMD="ps aux | grep 'metastore' | grep -v grep | awk '{print $2}' | xargs kill -9 2>/dev/null"
HIVE_METASTORE_STOP_CMD="pgrep -f 'metastore' | xargs kill -9 2>/dev/null"
HIVE_METASTORE_CHECK_CMD="ps aux | grep 'metastore' | grep -v grep"
HIVE_HS2_START_CMD="nohup $HIVE_HOME/bin/hive --service hiveserver2 > /tmp/hive/hive_hs2.log 2>&1 &"
#HIVE_HS2_STOP_CMD="ps aux | grep 'hiveserver2' | grep -v grep | awk '{print $2}' | xargs kill -9 2>/dev/null"
HIVE_HS2_STOP_CMD="pgrep -f 'hiveserver2' | xargs kill -9 2>/dev/null"
HIVE_HS2_CHECK_CMD="ps aux | grep 'hiveserver2' | grep -v grep"
## Spark组件:Standalone模式(用绝对路径避免脚本冲突)
SPARK_START_CMD="$SPARK_HOME/sbin/start-all.sh"
SPARK_STOP_CMD="$SPARK_HOME/sbin/stop-all.sh"
SPARK_CHECK_CMD="jps | grep Master"
# 执行操作
if [ "$operation" = "start" ]; then
# 启动顺序:HDFS → YARN → Hive Metastore → HiveServer2 → Spark
start_component "HDFS" "$HDFS_START_CMD" "$HDFS_CHECK_CMD"
start_component "YARN" "$YARN_START_CMD" "$YARN_CHECK_CMD"
start_component "Hive Metastore" "$HIVE_METASTORE_START_CMD" "$HIVE_METASTORE_CHECK_CMD"
start_component "HiveServer2" "$HIVE_HS2_START_CMD" "$HIVE_HS2_CHECK_CMD"
start_component "Spark Standalone" "$SPARK_START_CMD" "$SPARK_CHECK_CMD"
# 启动完成提示
echo -e "\n======================================"
echo -e "${GREEN}所有组件启动操作执行完毕!${NC}"
echo -e "${YELLOW}验证地址:${NC}"
echo -e " HDFS UI: http://$(hostname):9870"
echo -e " YARN UI: http://$(hostname):8088"
echo -e " Spark Master UI: http://$(hostname):8081"
echo -e " HiveServer2 端口: 10000"
echo -e "======================================"
else
# 关闭顺序:Spark → Hive → YARN → HDFS(反向依赖)
stop_component "Spark Standalone" "$SPARK_STOP_CMD" "$SPARK_CHECK_CMD"
stop_component "HiveServer2" "$HIVE_HS2_STOP_CMD" "$HIVE_HS2_CHECK_CMD"
stop_component "Hive Metastore" "$HIVE_METASTORE_STOP_CMD" "$HIVE_METASTORE_CHECK_CMD"
stop_component "YARN" "$YARN_STOP_CMD" "$YARN_CHECK_CMD"
stop_component "HDFS" "$HDFS_STOP_CMD" "$HDFS_CHECK_CMD"
# 关闭完成提示
echo -e "\n======================================"
echo -e "${GREEN}所有组件关闭操作执行完毕!${NC}"
echo -e "======================================"
fi
}
# 执行主函数
main "$@"