HBase集群新节点安装配置工具(Shell 脚本)

在之前两篇随笔中,主要介绍了在一个分布式集群下配置Hadoop,Zookeeper以及HBase 的流程。在实际情况中,配置HBase集群时,需要配置的节点太多,并且配置的内容基本相同。为了避免重复繁琐的配置工作,可以使用Shell脚本工具来自动完成这些流程化的工作,节省时间并且减少人工配置错误的情况。

本文介绍的是在需要批量添加集群节点并配置HBase的情况下,可以使用到的自动化配置工具,主要是几个Shell脚本来完成新节点的加入以及集群启动和停止。当然其中不可避免的还是需要人工参与部分配置工作,但是脚本工具基本上可以让配置人员完全解放于重复而费时的配置工作了。

所有软硬件平台均与《Hadoop平台搭建(VMware、CentOS)》相同,且所有操作以root用户执行

=====================================================================================

一、创建新的节点(虚拟主机)

  新的虚拟主机可以用iso文件自行安装,但是为了提高效率,我们使用VMware的克隆虚拟机功能,需要手动安装一台模板虚拟主机,然后不断克隆新的虚拟主机。

  下面以Slave8为例,从Slave8克隆出一台Slave9。

  需要说明的是,在模板主机的系统安装完成之后、被克隆之前我对其进行了以下操作以提高效率:

  ①修改个人使用习惯

    Ctrl+Alt+T to open a Terminal

    Terminal font --> Courier 10 Pitch Bold 13

    Terminal Text Color --> #000000

    Terminal Background Color --> #BBBBBB

    File Management Preferences Behavior --> Always open in browser windows

  ②安装VMTools工具

  ③永久关闭防火墙

    chkconfig iptables off

  ④安装配置JDK

    与之前相同

  ⑤关机

  下面开始克隆新的虚拟主机:

  

  

  

  

  

  

  

  克隆完成,开启Slave8,接下来将对Slave8进行配置,Slave9作为后续新节点的模板。

 

二、配置新节点(于新节点)

  0、查看新节点IP信息

    

    新分配IP地址为192.168.222.142,目前的网络主机名仍是最初的模板Slave5的主机名,需要修改。

  1、修改主机网络名称

    由于Slave8是从之前的模板克隆而来,完整克隆操作会分配新的IP地址,但不会修改网络主机名,因此需要先修改主机名为Slave8.Hadoop

    vi /etc/sysconfig/network

    

    将第二行的HOSTNAME修改为Slave8.Hadoop,可以看到节点目前的主机名仍为Slave5,需要随后重启才会生效

 

  2、配置SSH无密码通信

    ①开启SSH登录

      vi /etc/ssh/sshd_config

      找到并去掉以下两行的注释

      #RSAAuthentication yes

      #PubkeyAuthentication yes

    ②生成公钥RSA key

      ssh-keygen -t rsa  //不输入密码,一直回车

 

  3、重启以使配置生效

      reboot

 

三、配置新节点(于Master主机)

  在Master主机上我建立了一个clusters文件用于存储目前的集群节点信息

  需要注意的是,在下面的所有脚本中对clusters文件的引用都写成了绝对路径/home/myscript/clusters

  在加入Slave8之前clusters文件如下所示:

  

  建立自动配置脚本configure.sh

#!/bin/sh
int=0
if [ $# -ne 1 ]
then
    echo "Wrong Parameter."
else
    #0.Forework, get current cluster information
    while read IP ID
    do
        array[$int]=$IP
        let "int++"
    done</home/myscript/clusters
    
    #1.update hosts file
    echo $1' Slave'$int'.Hadoop' >> /etc/hosts
    for k in ${array[@]}
    do
        scp /etc/hosts root@$k:/etc
    done
    scp /etc/hosts root@$1:/etc

    #2.Configure SSH
    echo "adding RSA key from $1 to localhost."
    ssh root@$1 'cat ~/.ssh/id_rsa.pub>>/root/.ssh/authorized_keys'
    echo "copying to cluster members..."
    for i in ${array[@]}
    do
        scp /root/.ssh/authorized_keys root@$i:/root/.ssh
        scp /root/.ssh/known_hosts root@$i:/root/.ssh
    done
    scp /root/.ssh/authorized_keys root@$1:/root/.ssh
    scp /root/.ssh/known_hosts root@$1:/root/.ssh

    #3.update hadoop slaves
    echo $1 >> ${HADOOP_HOME}/etc/hadoop/slaves
    for j in ${array[@]}
    do
        scp ${HADOOP_HOME}/etc/hadoop/slaves root@$j:${HADOOP_HOME}/etc/hadoop
        scp /home/hadoop/hadoop-2.7.3/etc/hadoop/slaves root@$j:/home/hadoop/hadoop-2.7.3/etc/hadoop
    done
    scp -r /home/hadoop root@$1:/home

    #4.update zookeeper servers and myid info
    echo "server."$int"="$1":2888:3888" >> ${ZOOKEEPER_HOME}/conf/zoo.cfg
    for l in ${array[@]}
    do
        scp ${ZOOKEEPER_HOME}/conf/zoo.cfg root@$l:${ZOOKEEPER_HOME}/conf
    done
    scp -r /home/zookeeper root@$1:/home
    ssh root@$1 "echo "$int" > /home/zookeeper/zookeeper-3.4.6/data/myid"
    
    #5.update hbase
    sed -i -r 's/<value'\>'(Master.*Hadoop.*)</<value'\>'\1,'"$1"'</g' /home/hbase/hbase-1.2.4/conf/hbase-site.xml
    echo $1 >> /home/hbase/hbase-1.2.4/conf/regionservers
    for m in ${array[@]}
    do
        scp -r /home/hbase/hbase-1.2.4/conf root@$m:/home/hbase/hbase-1.2.4/
    done
    scp -r /home/hbase root@$1:/home
    
    #6.update environment variables on new member
    scp /etc/profile root@$1:/etc/profile
    ssh root@$1 'source /etc/profile'

    #7.update cluster info
    echo $1' Slave'$int'.Hadoop' >> /home/myscript/clusters
fi

 

  执行脚本,需要加上新节点的IP作为唯一参数(执行之前确认clusters文件路径正确):

    ./configure.sh 192.168.222.142

  执行过程中需要输入确认反馈'yes'以及新节点的root密码三次

 

四、配置新节点(于新节点)

  之所以有这部分的操作,是因为有一些远程命令好像并不能实际生效,在脚本的第6部分我设置了新节点更新环境变量的远程指令

  ssh root@<new_member_ip> 'source /etc/profile'

  但是此时用'env'指令查看新节点的环境变量发现并没有更新,因此需要手动在新节点上执行更新操作

  source /etc/profile

  再次'env'查看,发现环境变量HADOOP_HOME、ZOOKEEPER_HOME等已更新

 

五、启动集群(于Master主机)

  在执行之前需确认集群并没有在运行

  1、start_hadoop.sh

#!/bin/sh
${HADOOP_HOME}/sbin/start-all.sh

 

  2、start_zookeeper.sh

#!/bin/sh
int=0
#read current cluster members
while read IP ID
do
    array[$int]=$IP
    let "int++"
done</home/myscript/clusters

#start zookeeper server on cluster
for i in ${array[@]}
do
    echo "starting zookeeper on "$i
    ssh root@$i ${ZOOKEEPER_HOME}'/bin/zkServer.sh start'
done

 

  3、start_hbase.sh

#!/bin/sh
/home/hbase/hbase-1.2.4/bin/start-hbase.sh

 

   4、start_all.sh

#!/bin/sh
echo "===============Start All==============="
echo "1.Starting Hadoop"
./start_hadoop.sh
echo "------------------------------------------------------"
echo "2.Starting Zookeeper"
./start_zookeeper_new.sh
echo "------------------------------------------------------"
echo "3.Starting HBase"
./start_hbase.sh

echo "===============DONE==============="

 

   5、执行start_all.sh(执行之前确认脚本路径及clusters文件路径正确)

    ./start_all.sh

   6、启动成功

  http://192.168.222.134:50070/

  

  http://192.168.222.134:16010/

  

 

六、关闭集群(于Master主机)

  建立脚本stop_all.sh

#!/bin/sh
int=0
echo "===============Stop All==============="

    echo "1.stopping hbase"
    /home/hbase/hbase-1.2.4/bin/stop-hbase.sh
    
    echo "---------------------------------------"

    echo "2.stopping zookeeper"
    while read IP ID
    do
        array[$int]=$IP
        let "int++"
    done < /home/myscript/clusters
    for i in ${array[@]}
    do
        echo "stop zookeeper on "$i
        ssh root@$i ${ZOOKEEPER_HOME}'/bin/zkServer.sh stop'
    done
    echo "---------------------------------------"

    echo "3.stopping hadoop"
    ${HADOOP_HOME}/sbin/stop-all.sh

echo "===============Done==============="

 

   执行脚本(注意clusters文件路径)

    ./stop_all.sh

 

七、存在问题

  1、路径问题,可以将clusters的路径修改一下解决代码内部修改的问题

 

  2、IP和ID的问题,在一些配置文件如hbase-site.xml中集群原本是以网络主机名Slave.Hadoop来设置的,但是在脚本里面我增加新主机时直接用了IP地址,虽然并不影响,但是不够完善

 

  3、集群启动之前可以再写一个检查脚本,比如确认集群通信正常、防火墙关闭等。

 

  4、现在的方案是将Master上面的软件文件夹整体复制到新节点上,但是其实可以用官方压缩包的方式解压来安装软件,再把配置文件覆盖掉以完成配置。这样可以节省一些传输的代价,因为有一些运行后产生的日志文件等是不需要传到新节点上的。

 

posted @ 2017-03-24 17:40  zmt0429  阅读(766)  评论(0编辑  收藏  举报