接上一章节,在单机版的HBase中,HMaster,HRegionServer,Zookeeper都在一个JVM进程中运行,通过两个阶段来搭建、学习分布式的HBase,伪分布式和分布式。
一,伪分布式HBase
HBase仍然在单个主机上运行,但是每个HBase的守护进程(HMaster,HRegionServer,Zookeeper)作为一个单独的进程运行。分布式,伪分布式的HBase对于生产环境来说没有意义,仅限于学习。
首先搭建好配置号Hadoop和Hdfs,并且运行正常,且使用Hadoop2。搭建文档见链接。
如果已经运行了HBase,先停止HBase。
1.1,配置Hbase
编辑Hbase根目录下conf目录下的hbase-site.xml配置文件,首先添加以下属性指示hbase以分布式模式运行,一个守护进程对应一个JVM进程。
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
接下来,该表hbase.rootdir配置,从本地文件系统到HDFS实例的地址,使用hdfs://标记,在这个例子中,HDFS在172.16.0.2:9000运行,确认删除hbase.unsafe.stream.capability.enforce配置,或者设置为true。
<property>
<name>hbase.rootdir</name>
<value>hdfs://172.16.0.2:9000/hbase</value>
</property>
不需要在hdfs中创建目录,HBase会自动创建,如果你创建了HBase会尝试迁移。
1.2,启动Hbase
[root@ecs-7bc6-0001 hbase-2.2.0]# ./bin/start-hbase.sh
如果配置正确的话jps命令会有HMaster,HRegionServer进程运行。
[root@ecs-7bc6-0001 hbase-2.2.0]# jps
30979 HMaster
31097 HRegionServer
1.3,检查HDFS中hbase目录
[root@ecs-7bc6-0001 hbase-2.2.0]# hdfs dfs -fs hdfs://172.16.0.2:9000/ -ls /
Found 5 items
drwxr-xr-x - root supergroup 0 2019-07-25 14:39 /hbase
伪分布式的HBase已经搭建ok,可以使用hbase shell操作hbase了。
1.4,启动和停止备用的HBase Master(HMaster)服务。
HBMaster服务管理HBase集群,可以最多启动9个备用的HMaster服务,这样就有10个HMaster服务。要启用备份的HMaster服务,使用local-master-backup.sh,对于要启动的每个备用服务,需要传递主HMaster服务端口的偏移量,每个HMaster使用两个端口(默认是16000和16010),端口在默认端口(16000,16010)基础上偏移,因此使用偏移量2,备用的HMaster将使用端口(16002,16012),以下命令启动两个备用的HMaster,端口偏移量分别是1,2.。
[root@ecs-7bc6-0001 hbase-2.2.0]# ./bin/local-master-backup.sh start 1 2
running master, logging to /home/work/docker/hbase/hbase-2.2.0/bin/../logs/hbase-root-1-master-ecs-7bc6-0001.novalocal.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/work/package/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/work/docker/hbase/hbase-2.2.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
running master, logging to /home/work/docker/hbase/hbase-2.2.0/bin/../logs/hbase-root-2-master-ecs-7bc6-0001.novalocal.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/work/package/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/work/docker/hbase/hbase-2.2.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
在jps查看jvm进程
[root@ecs-7bc6-0001 hbase-2.2.0]# jps
30979 HMaster
32694 HMaster
488 Jps
31097 HRegionServer
331 HMaster
可以看到现在有三个HMaster进程
要在不停止集群的情况下停止备用的HMaster服务,需要找到HMaster进程的PID,PID存储在/tmp/hbase-USER-X-master.pid文件中,使用kill命令杀死进程。
1.5,启动和停止额外的RegionServer
HRegionServer按照HMaster的指示管理其StoreFiles中的数据,通常,一个HRegionServer在集群中的每一个节点上运行。
使用local-regionservers.sh命令可以运行多个RegionServer,工作方式与local-master-backup.sh类似,提供参数代表端口的偏移量,每个RegionServer需要两个端口,默认端口为16020和16030,如果要修改默认端口,请在脚本local-regionservers.sh中修改HBASE_RS_BASE_PORT和HBASE_RS_INFO_BASE_PORT,设置为需要使用的端口。以下启动2个本地的RegionServer.
[root@ecs-7bc6-0001 hbase-2.2.0]# ./bin/local-regionservers.sh start 1 2
running regionserver, logging to /home/work/docker/hbase/hbase-2.2.0/bin/../logs/hbase-root-1-regionserver-ecs-7bc6-0001.novalocal.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/work/package/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/work/docker/hbase/hbase-2.2.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
running regionserver, logging to /home/work/docker/hbase/hbase-2.2.0/bin/../logs/hbase-root-2-regionserver-ecs-7bc6-0001.novalocal.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/work/package/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/work/docker/hbase/hbase-2.2.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
使用jps命令查看jvm进程
[root@ecs-7bc6-0001 hbase-2.2.0]# jps
1328 HRegionServer
30979 HMaster
32694 HMaster
1432 HRegionServer
31097 HRegionServer
331 HMaster
1519 Jps
可以看到共有三个HRegionServer进程。
1.6,停止RegionServier
.bin/local-regionservers.sh stop 3
二,分布式HBase
实际上,需要完全分布式配置才能完全测试HBase并在实际场景中使用HBase。在分布式配置中,集群包含多个节点,每个节点运行一个或者多个HBase守护进程,这些包括主要和备用HMaster,多个Zookeeper节点,多个RegionServer节点。
接下来搭建添加两个节点以上的集群,结构如下表。
Node Name | Master | ZooKeeper | RegionServer |
master2 | yes | yes | no |
slave3 | backup | yes | yes |
slave4 | no | yes | yes |
首先,保证三台主机在一个网络中,保证三个节点有所有的连接权限,没有防火墙限制,如果出现no route to host错误,先检查防火墙。如果已经启动了其他Habase进程,先停止HBase进程。
2.1,配置不需要密码登录的SHH访问
master2需要可以登录到slave3,slave4和自己去启动守护进程,最简单的做法是在所有的主机上使用相同的用户名,配置不需要密码登录的shh到其他节点。参考《配置不需要密码登录ssh》配置。
2.2,准备master2节点
master2节点将运行主HMaster和Zookeeper,不运行RegionServer。配置不在master2上启动RegionServer.
2.2.1,编辑conf/regionservers并删除包含localhost的行,添加slave3和slave4的主机或者ip配置到配置中。
即使确实想在master2节点上运行RegionServer,也不能使用localhost,其他节点会使用他的ip或者主机名和他通信。
2.2.2,配置HBase使用slave3作为一个备用的HMaster。
创建一个新文件在conf/名称为backup-masters,在文件中添加slave3的主机或者ip。
2.2.3,配置Zookeeper
实际上,你需要仔细的考虑Zookeeper的配置, 您可以在zookeeper部分找到有关配置ZooKeeper的更多信息,根据这个配置,HBase启动和管理集群每个节点上的Zookeeper实例。
在master2上修改hbase-site.xml,增加如下属性。
<property>
<name>hbase.zookeeper.quorum</name>
<value>master2,slave3,slave4</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/root/zookeeper</value>
</property>
2.3,准备slave3和slave4节点
下载HBase安装包,解压,从master复制配置文件到slave3,slave4.
2.4,启动测试集群
2.4.1,确保没有HBase在任何节点运行
如果没有停止之前运行的HBase进程,接下来的步骤会出现错误,使用jps命令检查HBase是否在任何节点上运行,查找进程HMaster,HRegionServer,HQuirunmPeer如果存在,kill掉。
2.4.2,启动
在master2,使用start-hbase.sh启动hbase。Zookeeper首先启动,接下来是master,下来是regionServer,最后是备用master。
2.4.3 ,验证processes运行
在每个节点运行jps,查看jvm进程,验证是不是正确的进程列表。
ZooKeeper进程,HQuorumPeer进程是一个Zookeeper实例,有HBase管理,如果以这种方式使用Zookeeper,则每个集群节点仅限一个实例,并且只适用于测试。如果Zookeeper在HBase之外运行,则该进程称为QuorunmPeer。
2.4.4,查看Web UI
在HBase0.98.x以上的版本中,HBase的Web UI的端口,Master从60010变为16010,region从60030变为16030.
如果所有都配置正确,您就可以连接到http://master2:16010/或者备用master http://slave3:16010/,也可以通过主机或IP加端口查看其他regionserver的web UI。
(完)(^_^)