文章目录
一.前言
平日工作中,启动Hadoop生态圈的一堆程序是个大工程,此时linux脚本一键启动就显得格外重要。
废话不多说,直接手把手一步步实现。
二.运行结果演示
为了证明一下脚本确实可用,先演示运行结果
1.放在自己设置的文件夹中,运行
2.出现选项,一般选5,因为是按顺序启动的,选5会启动所有
3.运行结果成功,(zookeeper不见了,重启显示已启动,隐身了?)
三.设置配置文件
1.设置配置文件 start.cnf,文件中的‘->’, ‘_’, ‘;’, '#'都是专门设置的分割符,方便脚本实用。
hadoop->NameNode_SecondaryNameNode_DataNode_ResourceManager_NodeManager;start-dfs.sh_start-yarn.sh
hive->HiveMetaStore_HiveServer2;nohup$hive#--service#metastore>hive.log#2>&1#&_nohup#hive#--service#hiveserver2>hive.log#2>&1#&
zeppelin->ZeppelinServer;zeppelin-daemon.sh#start
zookeeper->QuorumPeerMain;zkServer.sh#start
hbase->HMaster_HRegionServer;start-hbase.sh
四.一键启动脚本
#!/bin/bash
source /etc/profile
# 一键启动配置文件
CNF_FILE='start.cnf'
#验证配置文件(必须存在且为文件)
if[ ! -e $CNF_FILE -o -d $CNF_FILE ]
then
echo $CNF_FILE" unavailable or directory,script will exit"
exit 0
fi
# 将配置文件内容读入变量并转为列表
CNF_LINES=(`cat start.cnf`)
# 循环按行输出配置信息,将第一项作为内容提示供用户选择
count=0
for item in ${CNF_LINES[@]}
do
((count+))
arr=(${item/->/ })
echo $count"、 "${arr[0]}
done
# 用户选择启动服务编号(向前启动所有服务)
read -p 'please input your choice:' choice
# 验证用户输入(必须为小于等于配置文件行数的整数)
if [[ $choice =~ ^[0-9]+$ ]]
then
if [ $choice -gt $count -o $choice -lt 1 ]
then
echo "choice must be between 1 and $count,script will exit"
exit 0
fi
else
echo 'choice must be a num, script will exit'
exit 0
fi
#自定义函数检查指定参数的服务是否完好,若有残留杀死进程
function killOnLeft(){
SIGN=$1
SIGN=$2
SERS=(${SERS//_/ })
PIDS=()
count=0
for item in ${SERS[@]}
do
#jps配合管道检查指定服务项是否存在
RST=`jps-ml|grep -w $item`
if [[ $RST ]]
then
RST=($RST)
PIDS[$count]=${RST[0]}
((count++))
fi
done
if [ $count -lt ${#SERS[@]} ]
then
# 若存在不完整的残留kill进程
if [ $count -gt 0 ]
then
for pid in ${PIDS[@]}
do
RST=`kill -9 $pid`
done
echo "$SIGN has service and killed"
else
echo "$SIGN has no service left"
fi
echo 'no'
else
echo "$SIGN is running"
echo "ok"
fi
}
#自定义函数调用参数命令集启动相应服务
function startSers(){
SIGN=$1
SERS=$2
SERS=${SERS//_/ }
for cmd in $SERS
do
RST=`eval ${cmd//#/ }`
done
echo $SING" has been started"
}
# 循环执行用户选择的配置文件中的命令行
count=0
while (( $count<$choice ))
do
LINE=${CNF_LINES[$count]}
LINE=(${LINE//->/ })
SIGN=${LINE[0]}
LINE=${LINE[1]}
LINE=(${LINE//;/ })
SERS=${LINE[0]}
CMDS=${LINE[1]}
RST=`killOnLeft $SIGN $SERS`
echo $RST
if [[ $RST =~ no$ ]]
then
RST=`startSers $SIGN $CMDS`
echo $RST
fi
((count++))
done