【第五站】集群组件一键启动/关闭脚本(Hadoop/YARN + Hive + Spark)

一、脚本解析说明

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 "$@"
相关推荐
黛玉晴雯子0012 小时前
Devops理念基础(持续更新)
运维·devops
青木川崎2 小时前
大数据技术之hive
大数据·hive·hadoop
apihz2 小时前
免费手机号归属地查询API接口详细教程
android·java·运维·服务器·开发语言
lvbinemail2 小时前
svn的web管理后台服务svnWebUI
运维·前端·svn·jar
宇钶宇夕2 小时前
跨协议冗余通信方案落地:EPN-330网关打通西门子S7-1517H与编码器的控制链路
运维·网络·自动化
搬砖快乐~2 小时前
面经:大数据开发岗-初面 面试题(40分钟)
大数据·hadoop·spark·kafka·面试题·面经
txzz88882 小时前
CentOS-Stream-10 搭建FTP服务器之系统用户访问
linux·运维·服务器·centos·ftp服务器·ftp 系统用户访问
ℳ₯㎕ddzོꦿ࿐2 小时前
零基础教程:在 Linux 上通过 Docker 快速部署 Dify
linux·运维·docker·dify
学海_无涯_苦作舟2 小时前
RabbitMQ Java Client源码解析——ConnectionFactory和Connection
linux·运维·服务器