用Linux脚本管理虚拟机中的大数据组件服务
启闭服务脚本
#!/bin/bash
if [ "$1" == "start" ];then
# 自定义启动服务函数,传入两个字符串参数:参数1为启动命令,参数2为启动方式
function startService(){
# 定义两个局部遍历依次接收用户传入的两个参数
# service 为启动命令
local service=$1
# exeType 为启动方式(daemon:后台启动(用于那些会占用窗口的服务),非daemon表示正常启动)
local exeType=$2
if [ "$exeType" == "daemon" ];then
# 后台启动
nohup $service 1>/dev/null 2>&1 &
else
# 正常启动
$service 1>/dev/null 2>&1
fi
# 判断执行启动脚本后的状态
if [ $? -ne 0 ];then
# 因为服务按从上到下有依赖关系,所以任何一个脚本执行出错,将退出整个脚本,所以选择exit而非return
# 函数按通用规则 return 0:正常,非0:表示异常;若函数中return缺省,则默认返回最后一条命名的状态即改命令执行后的$?
echo "ERROR : FAIL TO EXECUTE $service IN MODE OF $exeType ... EXIT ..."
# 退出脚本
exit 1
else
# 成功则正常输出提示结果
echo "INFO : SUCCESS TO EXECUTE $service IN MODE OF $exeType"
fi
}
# 依次按服务依赖顺序调用启动服务函数,并为每次调用传入启动命令和启动方式
# 启动 hadoop hdfs
startService "start-dfs.sh" "non-daemon"
# 启动 hadoop yarn
startService "start-yarn.sh" "non-daemon"
# 启动 ZooKeeper
startService "zkServer.sh start" "non-daemon"
# 启动 HBase
startService "start-hbase.sh" "non-daemon"
# 启动 hadoop job history server
#startService "mapred --daemon start historyserver" "self-daemon"
# 启动 hive metastore
#startService "hive --service metastore" "daemon"
# 启动 hive server2(供idea,zeppelin等客户端通过jdbc远程连接使用)
#startService "hive --service hiveserver2" "daemon"
# 启动 zeppelin
#startService "zeppelin-daemon.sh start" "non-daemon"
# 启动 spark
#startService "/opt/software/spark-3.1.2/sbin/start-all.sh" "non-daemon"
elif [ "$1" == "stop" ];then
# 自定义启动服务函数,传入两个字符串参数:参数1为关闭命令,参数2为关闭方式
function stopService(){
# 服务名称或关闭命令
local service=$1
# 关闭方式(command:命令关闭,pid:根据服务查找进程编号(pid)在借助kill命令关闭)
local exeType=$2
if [ "$exeType" == "command" ];then
# 直接执行参数一命令关闭服务
$service 1>/dev/null 2>&1
# 根据关闭命令执行的状态展示结果
if [ $? -eq 0 ];then
echo "INFO : SUCCESS TO EXECUTE $service"
else
echo "ERROR : FAIL TO EXECUTE $service"
fi
else
# 根据参数一传入的服务名称查看进程编号(pid)
local pid=$(jps -ml|grep $service|awk '{print $1}')
if [ "$pid" ];then
# 如果进程编号存在,则直接强制 kill
kill -9 $pid
# 根据kill的状态展示结果
if [ $? -eq 0 ];then
echo "INFO : SUCCESS TO KILL $service WITH PID $pid"
else
echo "ERROR : FAIL TO KILL $service WITH PID $pid"
fi
else
echo "INFO : NO SERVICE EXIST WITH NAME OF $service"
fi
fi
}
# 根据服务的依赖关系,逆向逐个关闭服务
# 首先关闭 spark
# stopService "/opt/software/spark-3.1.2/sbin/stop-all.sh" "command"
# 首先关闭 zeppelin
stopService "zeppelin-daemon.sh stop" "command"
# 再关闭可能存在的 beeline 客户端
stopService "BeeLine" "pid"
# 然后关闭可能存在的 hive 客户端
stopService "CliDriver" "pid"
# 确定无任何连接指向 hive 后,先关闭 hive server2
stopService "HiveServer2" "pid"
# 再关闭 hive metastore
stopService "HiveMetaStore" "pid"
# 再关闭 HBase
stopService "stop-hbase.sh" "command"
# 再关闭 ZooKeeper
stopService "zkServer.sh stop" "command"
# 然后关闭JobHistoryServer
stopService "JobHistoryServer" "pid"
# 最后关闭 yarn 和 hdfs
stopService "stop-yarn.sh" "command"
stopService "stop-dfs.sh" "command"
else
# 附带查一下java进程
jps -ml
fi
脚本解读及其使用方法
1.传参与脚本分支
脚本通过检查第一个参数来决定执行哪种操作。
如果参数是"start",启动服务。
如果参数是"stop",停止服务。
如果参数不是"start"或"stop",则默认执行jps -ml
来显示Java进程。
启动和停止服务的分支采用的都是函数+调用
的基本结构
涉及的服务有(可自行添加):
- Hadoop
- Hadoop HDFS
- Hadoop YARN
- Hadoop JobHistoryServer
- Hive
- HiveMetaStore
- HiveServer2
- ZooKeeper
- HBase
- spark
- Zeppelin
...
2.启动服务(start
分支)
定义了一个函数startService
用于启动服务,它接受两个参数:要执行的启动命令和启动方式("daemon"和"non-daemon")
3.停止服务(stop
分支)
定义了一个函数stopService
用于停止服务,它接受两个参数:服务名称和关闭方式(通过命令"command"或查找并杀死进程"pid")
4.如何将新增服务纳入开启和关闭列表?
- 确定新增服务的开启(daemon?non-daemon?)和关闭(command?pid?)方式
- 查找新增服务的理想开启和关闭顺序(注意开启和关闭的顺序应该相反)
- 若新增服务存在着客户端,应该补充可能的客户端关闭命令。
5.启动前的准备
- 需要先确定该服务的关联服务是什么,将该服务及其关联服务同时开启(HBase的关联服务是Hadoop、ZooKeeper)
- 只需注释掉无关服务的开启指令,无需注释关闭服务的指令