一键启动NameNode和DataNode--shell脚本

  使用shell脚本,一键启动hadoop中的NameNode和DataNode。分为普通版和装逼版。装逼版较普通版多了很多判断和信息提示,当然主要还是为了我练习shell脚本而写的。

  如果想实现复用,请注意:

    1.将HADOOP_HOME改为自己的hadoop安装路径。

    2.脚本的权限不低于700

  如果复用装逼版在满足上面的条件后,还需要注意

    1.properties和act.sh必须在同一个文件夹中

    2.确保该文件夹以及脚本的权限不低于700

 

普通版一键启动/关闭/重启NameNode和DataNode

 1 #!/bin/bash
 2 
 3 #######################################################
 4 ####                                               ####
 5 ####精简版的启动,停止,重启                       ####
 6 ####                                               ####
 7 #######################################################
 8 
 9 # hadoop的安装目录以及启动停止命令所在的文件路径
10 HADOOP_HOME=/bigData/softWare/hadoop
11 HADOOP_SBIN=${HADOOP_HOME}/sbin
12 
13 # 用于判断输入是否正确的正则
14 regex='^[ 1-3 ]$'
15 # 循环判断用户的输入
16 i=0
17 while [ ${i} -eq 0 ]
18 do
19     echo ""
20     echo -e "启动这个脚本你想干什么:\n\t1).启动Hadoop\n\t2).关闭hadoop\n\t3).重启hadoop"
21     read -p "输入你的选择:[1,2,3] > " choose
22     echo ""
23     if [[ ${choose} =~ ${regex} ]];then
24         if [ ${choose} -eq 1 ];then
25             ${HADOOP_SBIN}/hadoop-daemon.sh start namenode
26             ${HADOOP_SBIN}/hadoop-daemon.sh start datanode
27             echo "杨华彬威武!!!"
28             echo ""
29             exit 1
30         elif [ ${choose} -eq 2 ];then
31                 ${HADOOP_SBIN}/hadoop-daemon.sh stop datanode
32                 ${HADOOP_SBIN}/hadoop-daemon.sh stop namenode
33                 echo "杨华彬威武!!!"
34                 echo ""
35                 exit 1
36         else
37             ${HADOOP_SBIN}/hadoop-daemon.sh stop datanode
38             ${HADOOP_SBIN}/hadoop-daemon.sh stop namenode
39             ${HADOOP_SBIN}/hadoop-daemon.sh start namenode
40             ${HADOOP_SBIN}/hadoop-daemon.sh start datanode
41             echo "杨华彬威武!!!"
42             echo ""
43             exit 1
44         fi
45     #else
46     #    echo "你输入的字符非法,请重新输入!"
47     fi
48 done

 

 

装逼版一键启动/关闭/重启NameNode和DataNode

properties脚本(用到的变量和函数)

#!/bin/bash

############################################

#本脚本主要用来给调用它的脚本传递参数,方法#

############################################

#这个是启动NameNode和datanode所在的sbin目录,如果安装目录有改动请将以下值改为自己的安装目录的路径
HADOOP_HOME=/bigData/softWare/hadoop
HADOOP_SBIN=${HADOOP_HOME}/sbin

# 这个是匹配用户输入的是否正确的正则变量
regex='^[ 1-2 ]$'

#启动NameNode,并将原有脚本输出的信息干掉
startNameNode() {
    echo "开始启动NameNode"    
    ${HADOOP_SBIN}/hadoop-daemon.sh start namenode 1>>/dev/null 2>>"&1"
    if [ $? -eq 0 ]
    then
        echo ""
        resultOfDataNode=$(getPIDOfNameNode)
        echo "NameNode启动成功,进程号是:$resultOfDataNode"
    else
        echo ""
        echo "NameNode启动失败,请检查原因!"
        exit 1
    fi
}

#启动datanode,并将原有的信息干掉
startDataNode() {
    resultOfDataNode=$(getPIDOfDataNode)  # 判断DataNode是否已经启动,启示这一步是多于的,前面已经验证过了。
    if [ "${resultOfDataNode}" == ""  ]
    then
        echo ""
        echo "正在启动DataNode。"
        ${HADOOP_SBIN}/hadoop-daemon.sh start datanode 1>>/dev/null 2>>'&1'
        if [ $? -eq 0 ]
        then 
            echo ""
            echo "DataNode启动成功!"
            echo ""
            echo "情况汇报:"
            echo "NameNode启动成功,进程号是:$(getPIDOfNameNode)"
            echo "DataNode启动成功,进程号是:$(getPIDOfDataNode)"
            echo ""
            exit 1
        else
            echo ""
            echo "DataNode没有启动,请检查原因!!!"
            exit 1
        fi
    else
        echo ""
        echo -e "我承认,如果你看到这个信息,不是脚本错误,\n就是发生了他妈的我也不懂的什么错误!"
        exit 1
    fi
}

# NameNode已经启动的情况下的处理
nameNodeAlreadyStart() {
    stopNameNode=0
    while [ ${stopNameNode} -eq 0 ]
    do
        echo ""
        result=$(getPIDOfNameNode)
        echo "NameNode已经启动,进程号是:${result},是否关掉?"
        echo -e "\t1).关掉NameNOde并重启。\n\t2).不管,继续启动DataNode." 
        echo ""
        read -p "请输入您的选择:[1/2] > " ifStopNameNode

        if [[ ${ifStopNameNode} =~ ${regex} ]]
        then
            if [ ${ifStopNameNode} -eq 1  ]
            then
                stopNameNode
                echo ""
                echo "正在启动NameNode"
                ${HADOOP_SBIN}/hadoop-daemon.sh start namenode 1>>/dev/null 2>>'&1'
                if [ $? -eq 0  ]
                then 
                    result=$(getPIDOfNameNode)
                    echo ""
                    echo "NameNode节点启动成功,进程号是:$result"
                    break 
                else
                    echo ""
                    echo "NameNode启动失败,请检查原因!!!"
                    exit 1
                fi
            else
                dataNodeIfStart
            fi
        else
            echo ""
            echo "您输入的数字有误,请重新输入!!!"
        fi
    done
}

# DataNode已经启动的情况的处理。
dataNodeAlreadyStart(){
    i=0
    while [ $i -eq 0 ]
    do
        echo ""
        echo -e "DataNode已经启动,请问这种情况该怎么办?:\n\t1).重启DataNode。\n\t2).不重启DataNode"
        echo ""
        read -p "请输入您的选择:[1/2] > " a
        if [[ ${a} =~ ${regex} ]]
        then
            if [ ${a} -eq 1 ]
            then 
                stopDataNode
                startDataNode
                exit 1
            else
                echo ""
                echo "情况汇报:"
                echo "NameNode启动成功,进程号是:$(getPIDOfNameNode)"
                echo "DataNode启动成功,进程号是:$(getPIDOfDataNode)"
                echo ""
                exit 1
            fi
        fi
    done
}

#关掉namenode,将信息干掉(完成)
stopNameNode() {
    
    result=$(getPIDOfNameNode)
    
    if [ "${result}" == "" ]
    then
        echo ""
        echo -e "\033[40;35mNameNode不知道什么原因,已经关闭。请注意检查原因!!!\033[40;35m"
        echo -e "\033[40;37m \033[40;37m"
        echo "NameNode和DataNode已经关闭!"
        echo ""
        exit 1
    else
        echo "开始停止NameNode"
        ${HADOOP_SBIN}/hadoop-daemon.sh stop namenode 1>>/dev/null 2>>'&1'
        if [ $? -eq 0 ]
        then
            echo ""
            echo "NameNode关闭成功!"
            echo ""
            echo "DataNode和NameNode关闭成功!"
            echo ""
            exit 1
        else
            echo ""
            echo "对不起NameNode没有关掉,进程号是:$(getPIDOfNameNode)"
            echo "请检查NameNode无法关闭的原因!!!"
            echo ""
            exit 1
        fi
        
    fi
    
}

# 关掉datanode,并将信息干掉。(完成)
stopDataNode() {
    result=$(getPIDOfDataNode)
    if [ "${result}" == "" ]
    then
        echo ""
        echo -e "\033[40;35mDataNode不知道什么原因,已经关闭。请注意检查原因!!!\033[40;35m"
        echo -e "\033[40;37m \033[40;37m"
        stopNameNode
    else
        echo ""
        echo "正在关闭DataNode"
        ${HADOOP_SBIN}/hadoop-daemon.sh stop datanode 1>>/dev/null 2>>'&1'
        if [ $? -eq 0 ]
        then
            echo ""
            echo "DataNode关闭成功!"
        else
            echo ""
            echo "DataNode关闭失败!!!"
            echo "请检查失败原因!!!"
            exit 1
        fi
    fi
    
}

# 判断DataNode是否启动
dataNodeIfStart() {

    resultDataNode=$(getPIDOfDataNode)
    if [ "$resultDataNode" != ""  ] # 如果DataNode已经启动的话
    then
        dataNodeAlreadyStart
    else
        startDataNode
    fi
}

#获取NameNode的进程号(完成)
getPIDOfNameNode() {
    PIDOfNameNode=`jps|grep NameNode|awk '{print $1}'`
    echo ${PIDOfNameNode}
}

#获取DataNode的进程号(完成)
getPIDOfDataNode() {
    PIDOfDataNode=`jps|grep DataNode|awk '{print $1}'`
    echo ${PIDOfDataNode}
}

 

 

act.sh(脚本的运行)

#!/bin/bash

#######################################################

####启动和停止的脚本都在这个里面,本脚本指调用前面的###
####变量和方法。                                    ###

#######################################################

# 调用前面的properties文件,两个脚本必须放在同一个文件夹中,并分别又有执行权限
source ./properties

# 循环判断输入的数字是否合法,是否要执行

i=0

while [ $i -eq 0 ]
do    
    # 输出欢迎语句。
    echo ""
    echo "请问您是要启动hadoop还是要关闭
    1.)启动hadoop
    2.)关闭hadoop"
    echo ""
    read -p "请输入您的选择:[1,2]> " check1
    if [[ ${check1} =~ ${regex}  ]]     # 这一行用来判断输入的是否是1和2这两个数字。
    then
        if [ ${check1} -eq 1 ]          # 如果输入的是启动命令
        then
            echo ""
            resultNameNode=$(getPIDOfNameNode)
            if [ "$resultNameNode" != ""  ]     # 如果NameNode已经启动的话
            then
                nameNodeAlreadyStart
                echo ""
                dataNodeIfStart
            else                                # 如果DataNode没有启动的话
                startNameNode
                dataNodeIfStart
            fi
        else                            # 输入的是关闭hadoop的命令
            stopDataNode
            stopNameNode
            a=$(getPIDOfNameNode)
            b=$(getPIDOfDataNode)
            if [ "${a}" == "" ] && [ "${b}" == "" ]
            then 
                echo ""
                echo "NameNode和DataNode关闭成功!"
                echo ""
                exit 1
            fi
        fi
    else                            # 输入的不符合规范
        echo ""
        echo "输入非法,请重新输入!"
        #welcome
    fi
done

 

posted @ 2016-11-25 17:25  huabingood  阅读(1285)  评论(0编辑  收藏  举报