上一节课我们一起学习了单节点HBase建表、插入数据、删除数据、查询数据的知识,这节课我们一起来学习HBase集群的搭建。
第一步:下载HBase安装包hbase-0.96.2-hadoop2-bin.tar.gz
大家可以到Apache官网下载也可以直接到http://pan.baidu.com/s/1qXGDqo8这个地址进行下载。
第二步:搭建集群
关于集群的搭建大家可以参考:http://blog.csdn.net/u012453843/article/details/52829830这篇博客进行搭建。
第三步:在集群中安装HBase
我们把hbase-0.96.2-hadoop2-bin.tar.gz安装包上传到itcast01上(我的第一台服务器的主机名),如下所示,然后我们把它解压到/itcast目录下,使用的命令如下蓝色字体所示。
[root@itcast01 ~]# ls
anaconda-ks.cfg Desktop Downloads glibc-2.14.tar.gz hadoop-2.2.0.tar.gz install.log jdk-7u80-linux-x64.gz Pictures Templates
apache-maven-3.3.9-bin.tar.gz Documents glibc-2.14 hadoop-2.2.0-src hbase-0.96.2-hadoop2-bin.tar.gz install.log.syslog Music Public Videos
[root@itcast01 ~]# tar -zxvf hbase-0.96.2-hadoop2-bin.tar.gz -C /itcast/
解压完之后我们来配置HBase的配置文件,我们进入到/itcast/hbase-0.96.2-hadoop2/conf/这个目录下,可以看到如下所示的几个配置文件。我们要修改的是hbase-env.sh、hbase-site.xml和regionservers三个文件。
[root@itcast01 conf]# ls
hadoop-metrics2-hbase.properties hbase-env.cmd hbase-env.sh hbase-policy.xml hbase-site.xml log4j.properties regionservers
[root@itcast01 conf]#
首先我们来配置第一个文件:hbase-env.sh,这里我们使用工具NodePad++来编辑,关于如何使用NodePad++来编辑服务器配置文件大家可以参考:http://blog.csdn.net/u012453843/article/details/52987666这篇博客来学习。我们修改的地方有两处,第一处是JAVA_HOME,原来是被注释掉了,我们去掉前面的"#"号,然后jdk的版本换成我们实际安装的版本(默认版本是1.6的)。第二处配置是告诉HBase不要再使用自己的Zookeeper了,因为集群就有Zookeeper而且具有高可靠性,比它自己的好多了,因此它自己的就不要用了,把原来的true值改为false;这个配置开始也是被注释掉了,我们也像第一个配置一样打开它。改完之后保存,我们就修改完第一个配置文件了。
接着我们来配置第二个配置文件:hbase-site.xml,配置的内容以Tab键进行缩进。如下图所示。配置的内容大家可以到http://download.csdn.net/detail/u012453843/9669534这个地址下载hbase集群搭建.txt文件复制粘贴就可以了!
配置的三项内容注释中已经说的很清楚了,我就不多说了。
接着我们再来修改第三个配置文件:regionservers(被管理者),HBase做为管理者的是HMaster,被管理者是HRegionServer,被管理者一般有多个。这里我们把itcast03、itcast04、itcast05、itcast06做为HBase的被管理者。之所以没有把itcast02也当成被管理者是因为对于集群来说,高可靠性是最重要的,为了高可靠性我们至少有三台设备作为管理者(当然,我们这里简单点,就弄两个管理者,我们一会儿让itcast02也成为管理者)修改完后保存。
配置完上面的内容后,这里还有个问题,那就是HBase需要依赖集群的HDFS和Zookeeper,关于Zookeeper,我们在HBase的配置文件中已经明确指定了,但是关于HDFS,我们只是配置了http://ns1,它并不知道具体的映射关系,也就是说只是告诉HBase的小弟HRegionServer应该连NameNode,但是它并不知道NameNode具体在哪几台设备上,也不知道DataNode在哪几台设备上,那么这样的话,HRegionServer进程便无法正常启动。为了解决这个问题,我们有两种方式可以解决:第一种是在hbase-site.xml中配置映射关系,第二种就是把有映射关系的文件拷贝到HBase的conf目录下,这样HBase就会自动去读取配置文件并获取映射关系,从而可以正常启动HRegionServer进程。为了简单,我们这里就采用第二种方法即向HBase的conf目录下。
我们进入到hadoop的配置文件目录,如下所示。
[root@itcast01 itcast]#cd /itcast/hadoop-2.2.0/
[root@itcast01 hadoop-2.2.0]# ls
bin etc include lib libexec logs sbin share tmp
[root@itcast01 hadoop-2.2.0]# cd etc
[root@itcast01 etc]# ls
hadoop
[root@itcast01 etc]# cd hadoop/
[root@itcast01 hadoop]# ls
capacity-scheduler.xml hadoop-env.sh httpfs-env.sh mapred-env.cmd ssl-client.xml.example
configuration.xsl hadoop-metrics2.properties httpfs-log4j.properties mapred-env.sh ssl-server.xml.example
container-executor.cfg hadoop-metrics.properties httpfs-signature.secret mapred-queues.xml.template yarn-env.cmd
core-site.xml hadoop-policy.xml httpfs-site.xml mapred-site.xml yarn-env.sh
hadoop-env.cmd hdfs-site.xml log4j.properties slaves yarn-site.xml
我们把core-site.xml和hdfs-site.xml两个文件拷贝到HBase的配置文件目录下。
[root@itcast01 hadoop]# scp core-site.xml hdfs-site.xml /itcast/hbase-0.96.2-hadoop2/conf/
拷贝完之后我们到HBase的conf目录下看看是不是已经拷进来了,如下所示,发现确实已经有hadoop的那两个配置文件了。
[root@itcast01 hadoop]# cd /itcast/hbase-0.96.2-hadoop2/conf/
[root@itcast01 conf]# ls
core-site.xml hbase-env.cmd hbase-policy.xml hdfs-site.xml regionservers
hadoop-metrics2-hbase.properties hbase-env.sh hbase-site.xml log4j.properties
[root@itcast01 conf]#
到这步我们已经配置好了一台设备的HBase,接下来我们把这台设备上的HBase目录拷贝到其它设备上去。
为了拷贝的速度快点,我们可以把HBase的docs目录删掉再执行下面的命令,docs是文档,我们在Linux上基本上用不着
[root@itcast01 hbase-0.96.2-hadoop2]# ls
bin CHANGES.txt conf docs hbase-webapps lib LICENSE.txt logs NOTICE.txt README.txt
[root@itcast01 hbase-0.96.2-hadoop2]# rm -rf docs/
[root@itcast01 hbase-0.96.2-hadoop2]# ls
bin CHANGES.txt conf hbase-webapps lib LICENSE.txt logs NOTICE.txt README.txt
[root@itcast01 hbase-0.96.2-hadoop2]#
然后依次执行下面5条命令:
[root@itcast01 conf]# scp -r /itcast/hbase-0.96.2-hadoop2/ root@itcast02:/itcast/
[root@itcast01 conf]#scp -r /itcast/hbase-0.96.2-hadoop2/ root@itcast03:/itcast/
[root@itcast01 conf]#scp -r /itcast/hbase-0.96.2-hadoop2/ root@itcast04:/itcast/
[root@itcast01 conf]#scp -r /itcast/hbase-0.96.2-hadoop2/ root@itcast05:/itcast/
[root@itcast01 conf]#scp -r /itcast/hbase-0.96.2-hadoop2/ root@itcast06:/itcast/
拷贝完之后我们需要到这5台设备上的Itcast目录下看看是不是有了hbase-0.96.2-hadoop2,我们拿itcast04来说,如下所示,发现确实已经有这个文件了。
[root@itcast04 bin]# cd /itcast/
[root@itcast04 itcast]# ls
hadoop-2.2.0 hbase-0.96.2-hadoop2 zookeeper-3.4.5
[root@itcast04 itcast]#
接下来我们便来启动我们的HBase集群。
第一步:启动Zookeeper集群
我们的Zookeeper集群在itcast04、itcast05、Itcast06上,我们分别在这三台设备上启动Zookeeper。如下所示。
itcast04的Zookeepr启动步骤如下:
[root@itcast04 ~]# cd /itcast/zookeeper-3.4.5/bin
[root@itcast04 bin]# ls
README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh zookeeper.out
[root@itcast04 bin]# ./zkServer.sh start
JMX enabled by default
Using config: /itcast/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@itcast04 bin]# ./zkServer.sh status
JMX enabled by default
Using config: /itcast/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[root@itcast04 bin]#
itcast05的Zookeepr启动步骤如下:
[root@itcast05 ~]# cd /itcast/zookeeper-3.4.5/bin
[root@itcast05 bin]# ls
README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh zookeeper.out
[root@itcast05 bin]# ./zkServer.sh start
JMX enabled by default
Using config: /itcast/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@itcast05 bin]# ./zkServer.sh status
JMX enabled by default
Using config: /itcast/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
[root@itcast05 bin]#
itcast06的Zookeepr启动步骤如下:
[root@itcast06 bin]# ls
README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh zookeeper.out
[root@itcast06 bin]# ./zkServer.sh start
JMX enabled by default
Using config: /itcast/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@itcast06 bin]# ./zkServer.sh status
JMX enabled by default
Using config: /itcast/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[root@itcast06 bin]#
第二步:启动HDFS
我们在itcast01上启动HDFS,如下所示。
[root@itcast01 ~]# cd /itcast/hadoop-2.2.0/
[root@itcast01 hadoop-2.2.0]# sbin/start-dfs.sh
Starting namenodes on [itcast01 itcast02]
itcast01: starting namenode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-namenode-itcast01.out
itcast02: starting namenode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-namenode-itcast02.out
itcast06: starting datanode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-datanode-itcast06.out
itcast05: starting datanode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-datanode-itcast05.out
itcast04: starting datanode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-datanode-itcast04.out
Starting journal nodes [itcast04 itcast05 itcast06]
itcast05: starting journalnode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-journalnode-itcast05.out
itcast04: starting journalnode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-journalnode-itcast04.out
itcast06: starting journalnode, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-journalnode-itcast06.out
Starting ZK Failover Controllers on NN hosts [itcast01 itcast02]
itcast01: starting zkfc, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-zkfc-itcast01.out
itcast02: starting zkfc, logging to /itcast/hadoop-2.2.0/logs/hadoop-root-zkfc-itcast02.out
启动完itcast01之后我们查看当前进程,发现DFSZKFailoverController、NameNode两个进程。说明itcast01上HDFS启动成功。
[root@itcast01 hadoop-2.2.0]# jps
2936 DFSZKFailoverController
2695 NameNode
2978 Jps
[root@itcast01 hadoop-2.2.0]#
我们再来看itcast02上的进程,发现也有DFSZKFailoverController、NameNode这两个进程,说明itcast02也正常。
[root@itcast02 ~]# jps
2810 DFSZKFailoverController
2753 NameNode
2843 Jps
[root@itcast02 ~]#
这时itcast04、itcast05、itcast06上的进程如下所示,也是正常的。
[root@itcast04 bin]# jps
2749 JournalNode
2833 Jps
2689 DataNode
2603 QuorumPeerMain
[root@itcast04 bin]#
第三步:启动HBase
我们在itcast01上启动HBase,我们先到HBase的bin目录下,然后用命令./start-hbase.sh来启动HBase。如下所示。
[root@itcast01 ~]# cd /itcast/hbase-0.96.2-hadoop2/bin/
[root@itcast01 bin]# ./start-hbase.sh
starting master, logging to /itcast/hbase-0.96.2-hadoop2/bin/../logs/hbase-root-master-itcast01.out
itcast06: starting regionserver, logging to /itcast/hbase-0.96.2-hadoop2/bin/../logs/hbase-root-regionserver-itcast06.out
itcast05: starting regionserver, logging to /itcast/hbase-0.96.2-hadoop2/bin/../logs/hbase-root-regionserver-itcast05.out
itcast03: starting regionserver, logging to /itcast/hbase-0.96.2-hadoop2/bin/../logs/hbase-root-regionserver-itcast03.out
itcast04: starting regionserver, logging to /itcast/hbase-0.96.2-hadoop2/bin/../logs/hbase-root-regionserver-itcast04.out
启动完HBase之后,我们查看itcast01上的进程,如下所示,发现多了一个HMaster进程,这个进程是HBase的管理进程。
[root@itcast01 bin]# jps
2936 DFSZKFailoverController
2695 NameNode
3755 HMaster
3924 Jps
[root@itcast01 bin]#
这还不行,我们还需要到itcast03、itcast04、itcast05、itcast06上看看HBase的被管理者进程(HRegionServer)是否正常启动,如下所示。
Itcast03上的进程如下,发现有HRegionServer这个进程。
[root@itcast03 itcast]# jps
2795 HRegionServer
2825 Jps
[root@itcast03 itcast]#
接着看itcast04上的进程,发现HRegionServer也正常启动了。
[root@itcast04 itcast]# jps
3048 Jps
2749 JournalNode
2689 DataNode
2603 QuorumPeerMain
2925 HRegionServer
[root@itcast04 itcast]#
再看itcast05上的进程,HRegionServer也正常启动了。
[root@itcast05 bin]# jps
2628 QuorumPeerMain
2764 JournalNode
2922 HRegionServer
3060 Jps
2707 DataNode
[root@itcast05 bin]#
再看itcast06上的进程,HRegionServer也正常启动了。
[root@itcast06 bin]# jps
2615 QuorumPeerMain
2762 JournalNode
3053 Jps
2921 HRegionServer
2705 DataNode
[root@itcast06 bin]#
第四步:通过管理界面验证HBase集群是否搭建成功。
经过前三步,我们启动了HBase集群,现在我们从管理界面来验证我们的HBase集群。我们已经知道itcast01是我们HBase的管理者,因此我们从itcast01上来查看管理界面,HBase的端口号是60010,我们使用IP地址:端口号来访问界面。如下图所示,可以看到Region Servers有四台设备,分别是itcast03、itcast04、itcast05、itcast06,这也是我们配置的时候指定的,说明这个没问题。再往下看,我们可以看到"Backup Masters"(备份管理者的数量)是0,这也就意味着,一旦itcast01宕掉的话,整个HBase集群将无法运转。再往下是Tables的信息,当前我们还没有建任何表,因此现在是空的。
为了实现HBase集群的高可靠性,我们再启动一台设备作为HBase的管理者,我们在itcast02上启动HMaster进程。启动步骤如下所示,启动完之后我们检查是否有HMaster进程,发现是有的,说明在itcast02上也启动成功了HMaster进程。
[root@itcast02 itcast]# cd /itcast/hbase-0.96.2-hadoop2/bin
[root@itcast02 bin]# ls
get-active-master.rb hbase-cleanup.sh hbase-config.cmd hbase-daemons.sh local-master-backup.sh region_mover.rb replication start-hbase.sh test
graceful_stop.sh hbase.cmd hbase-config.sh hbase-jruby local-regionservers.sh regionservers.sh rolling-restart.sh stop-hbase.cmd thread-pool.rb
hbase hbase-common.sh hbase-daemon.sh hirb.rb master-backup.sh region_status.rb start-hbase.cmd stop-hbase.sh zookeepers.sh
[root@itcast02 bin]# ./hbase-daemon.sh start master
starting master, logging to /itcast/hbase-0.96.2-hadoop2/bin/../logs/hbase-root-master-itcast02.out
[root@itcast02 bin]# jps
2810 DFSZKFailoverController
3403 HMaster
3479 Jps
2753 NameNode
[root@itcast02 bin]#
既然现在有两个HMaster进程了,那么HBase怎么知道哪个HMaster应该是Active(激活)状态,哪个HMaster应该是Backup(备份)状态呢?其实它是靠Zookeeper来协调的,保证HBase集群同一时刻只能有一个激活的HMaster。
理论如此,我们还是通过管理界面来验证一下,我们还是访问itcast01的管理界面,如下图所示,可以发现在"Backup Masters"一栏出现了itcast02,说明itcast02当前处于Backup(备份状态)。
在管理界面的最下方有一些描述信息,如下图所示,我们可以点击下图红色圈住的"zk dump"来查看详细信息。
详细信息如下图所示,可以看到,Active状态的是itcast01,Backup状态的是itcast02,被管理者是itcast03、itcast04、itcast05、itcast06等等。
下面我们来验证一下该集群的高可靠性。为了验证,我们先强制杀死itcast01上的HMaster进程,如下所示,我们要想杀死HMaster进程,需要先知道它的进程号是多少,我们使用jps命令来查看当前所有进程,发现HMaster进程的进程号是3755,因此我们便需要杀死3755进程,强制杀死进程的命令是:kill -9 进程号,这里我们使用kill -9 3755来杀死这个进程,杀死后我们再使用jps命令来查看当前进程,发现已经没有HMaster进程了。
[root@itcast01 bin]# jps
2936 DFSZKFailoverController
2695 NameNode
3755 HMaster
4276 Jps
[root@itcast01 bin]# kill -9 3755
[root@itcast01 bin]# jps
4362 Jps
2936 DFSZKFailoverController
2695 NameNode
[root@itcast01 bin]#
杀死了itcast01上的HMaster进程之后,HBase集群就剩下一个HMaster进程了,我们这时来看一下itcast01上是否还能查看管理界面,如下图所示,发现itcast01已经无法浏览管理界面了(因为我们已经杀死了它的HMaster进程了)
既然itcast01的管理界面无法看了,我们便来看看itcast02的管理界面,发现itcast02已经自动变成Active状态了,现在Backup状态的设备数量为0。
接下来我们再启动itcast01的HMaster,如下所示。
[root@itcast01 bin]# ./hbase-daemon.sh start master
starting master, logging to /itcast/hbase-0.96.2-hadoop2/bin/../logs/hbase-root-master-itcast01.out
[root@itcast01 bin]# jps
4446 HMaster
2936 DFSZKFailoverController
2695 NameNode
4563 Jps
[root@itcast01 bin]#
启动完itcast01的HMaster之后我们再来看一下itcast01的管理界面,如下图所示,很明显界面信息比较少,这是Backup状态的HMaster的界面。当然,我们也可以通过点击"zk dump",来查看详情。
查看"zk dump"详情图片如下,可以看到现在itcast02是Active状态,itcast01是Backup状态。这说明我们的HBase集群具有自动切换角色的功能,从而保证了集群的高可靠性。
第五步:查看HBase的文件存储信息
我们在配置HBase的时候配置过<value>http://ns1/hbase</value>这么一条信息,这条配置意味着,HBase将在HDFS系统的根目录下创建一个hbase的目录,并将HBase产生的数据放到这个目录下面。那么我们通过查看HDFS系统来验证是否已经生成了Hbase的目录。我们浏览:http://169.254.254.10:50070来浏览,其中169.254.254.10是我的itcast01的IP地址,你根据你的IP地址来输入。50070是查看HDFS的端口。会出现如下图所示的界面,我们点击"Browse the filesystem"。
点击上图的"Browse the filesystem"之后我们可以看到如下图所示的界面,发现确实多了hbase这么一个目录。我们进去hbase目录看看都有哪些东西。
点击上图的"habase"之后我们会进入到如下图所示的界面,可以看到这些都是HBase的相关目录,用来存放HBase产生的数据。
第六步:创建表并在管理界面查看我们建的表
首先我们需要进入到hbase的shell模式,如下所示。
2016-11-02 01:14:41,546 INFO [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.96.2-hadoop2, r1581096, Mon Mar 24 16:03:18 PDT 2014
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/itcast/hbase-0.96.2-hadoop2/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/itcast/hadoop-2.2.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
0 row(s) in 2.6720 seconds
hbase(main):002:0> list
TABLE
user
1 row(s) in 0.0510 seconds
hbase(main):003:0>
好了,关于HBase集群搭建我们便一起学完了。