在之前两篇随笔中,主要介绍了在一个分布式集群下配置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上面的软件文件夹整体复制到新节点上,但是其实可以用官方压缩包的方式解压来安装软件,再把配置文件覆盖掉以完成配置。这样可以节省一些传输的代价,因为有一些运行后产生的日志文件等是不需要传到新节点上的。