1.1 单机模式
HBase 可以以单机模式方式运行,如果以此种方式运行,那么所有的 HBase 进程:Master、RegionServers 和 zookeeper 都运行在一个 JVM 实例上。
1.1.1 配置
在 conf/hbase-env.sh 文件配置 JAVA_HOME。
编辑 conf/hbase-site.xml 文件,配置如下属性:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/hbase</value>
<desription>此目录由 hbase 自动在本地文件系统创建</description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/zookeeper</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
</configuration>
**PS:**在开发或测试环境下,可以配置 hbase.rootdir 指向本地文件系统,但是在生成环境中,不建议这么做,以防丢失数据。应该指向 hdfs 文件系统,比如:
hbase.rootdir=hdfs://namenode.example.org:8020/hbase
PS:在本地模式启动 hbase 后,进入 hbase shell 操作页面出现 zookeeper 相关异常,建议使用自己安装的 zookeeper,不要使用 hbase 自带的 hbase,把 zookeeper 的配置文件拷贝到 ${HBASE_HOME}/conf/ 目录下。如果进入 hbase shell 正常,然而使用 hbase 命令操作,出现异常,如 Server is not yet run,且使用 jps 命令也没有看到 HMaster 进程,那么应该修改 hbase-site.xml 配置文件中的hbase.rootdir 和 hbase.zookeeper.property.dataDir 这两个属性,使得配置的值(目录)对当前启动 hbase 的用户有读写能力。
1.2 伪分布式模式
配置 hbase-site.xml:
<configuration>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:8020/hbase</value>
<description>hdfs 在本地安装,端口为 8082。不要在 hdfs 创建目录,由 hbase 自动创建</description>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>true</value>
<description>此属性要么配置为 true,要么就移除此属性配置</description>
</property>
</configuration>
现在,可以启动 hbase,验证是否一切正常。
HMaster 进程管理着整个 hbase 集群,为了高可用,避免单点故障问题,可以启动多个 backup HMaster 进程实例,为了启动 backup HMaster 进程实例,可以使用 local-master-backup.sh 脚本启动,不过对每个启动的 backup HMaster 进程实例,都需要添加参数来表示相对于 master HMaster 进程实例的端口偏移量。master HMaster 进程实例的默认两个端口是 16000 和 16010,从而端口偏移量都是加在这两个端口上。比如下面命令,开启了 3 个 backup HMaster 进程实例,分别使用的端口是 16002/16012、16003/16013 和 16005/16015。
$ ./bin/local-master-backup.sh start 2 3 5
为了停止 backup HMaster 进程实例,而又不影响整个 hbase 集群,即 master HMaster 进程实例依然正常服务,那么需要找到 backup HMaster 进程实例的 pid,这个 pid 可以从文件 /tmp/hbase-USER-X-master.pid,此文件内容只保存 pid。如下命令就会停止端口偏移量为 1 的 HMaster 进程实例,但集群正常服务中…
$ cat /tmp/hbase-testuser-1-master.pid |xargs kill -9
1.2.1 启动和停止额外的 HRegionServer
HRegionServer 按照 HMaster 的指示管理其 StoreFiles 中的数据,通常来说,HRegionServer 进程实例应该是跟集群的节点一一对应的,然而在伪分布式模式下,为了测试,在同一个节点运行多个 HRegionServer 进程实例是非常有用的。命令 local-regionservers.sh 就可以启动多个 HRegionServer,它的工作原理跟之前说的 local-master-backup.sh 差别不大。在 Hbase 1.1.0 之后,HMaster 不适用 HRegionServer 的端口,因此预留了 10 个端口(16020-16029 和 16030-16039)给 HRegionServer(它的默认端口是 16020 和 16030)。但是,在使用刚才说的命令运行额外的 HRegionServer 进程之前,还需要给环境变量 HBASE_RS_BASE_PORT 和 HBASE_RS_INFO_BASE_PORT 设置合适的值。在一台机器上,可以支持 99 个 HRegionServer,端口是 16200-16300。
$ .bin/local-regionservers.sh start 2 3 4 5
$ .bin/local-regionservers.sh stop 3
1.3 完全分布式
实际上,在真实场景中和完全测试 hbase 集群能力,需要搭建 hbase 完全分布式集群,在完全分布式集群中,包含许多节点,而每个节点都可能运行一个或多个 HBase 守护进程。比如 主从 HMaster、zookeeper 和 HRegionServer。下表是分布式集群架构样例:
Node Name | HMaster | Zookeeper | HRegionServer |
---|---|---|---|
node-a.example.com | yes | yes | no |
node-b.example.com | backup | yes | yes |
node-c.example.com | no | yes | yes |
1.3.1 免密码登录
为了启动守护进程,node-a 需要登录 node-b 和 node-c,当然还有它本身。因此,最简单的方式就是所有机器都是同一个用户名,并且配置从 node-a 登录到其他机器都是不需要密码的,即免密码登录。
-
在 node-a 上生成秘钥对
生成以运行 hbase 的用户名的秘钥对。命令如下:
$ ssh-keygen -t rsa
公钥的默认文件名是 id_rsa.pub
-
在其他机器上创建目录存放公钥
在 node-b 和 node-c 上的用户 home 目录下创建 .ssh 目录
-
拷贝公钥到其他机器
可以使用 scp 命令把 node-a 上的公钥拷贝到其他机器的 ${home}/.ssh 目录下。在其他机器上还需 要创建一个文件 ${home}/.ssh/authorized_keys,然后再把 id_rsa.pub 文件的内容追加到文件 authorized_keys 的末尾。不过需要注意的是,node-a 本身也需要完成这件事。
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
-
测试免密码登录
如果刚才的操作都正确的话,那么使用 ssh 命令从 node-a 上登录到其他机器应该就不需要在输入密码了。
-
由于在 node-b 上运行 backup HMaster 进程实例,因此需要重复上述步骤,只不过这次是以 node-b 为出发点,而不是 node-a,且需要注意的是,不要覆盖之前的 .ssh/authorized_keys 文件内容,因此使用重定向符号 >> ,而不是 >。
1.3.2 准备 node-a
node-a 机器将会运行 primary HMaster 进程 和 zookeeper 进程,但是是不需要运行 HRegionServer 进程。
-
编辑 conf/regionservers 文件,移除包含 localhost 的那一行,然后添加 node-b 和 node-c 的主机名或 ip 地址。
-
在 node-b 配置 HBase,运行 backup HMaster
在 conf 目录下创建文件名为 backup-masters 的文件,添加 node-b 的主机名。
-
配置 zookeeper
在生成环境中,需要仔细考虑下 zookeeper 的配置,因为配置的属性将会直接指导 HBase 启动和管理集群中各个节点上的 zookeeper 实例。
在 node-a 机器上,编辑 conf/hbase-site.xml 文件,添加如下属性:<property> <name>hbase.zookeeper.quorum</name> <value>node-a.example.com,node-b.example.com,node-c.example.com</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/usr/local/zookeeper</value> </property>
1.3.3 准备 node-b 和 node-c
node-b 机器会运行一个 backup HMaster 进程实例 和 zookeeper 进程实例。
-
下载且解压 hbase
-
拷贝 node-a 机器上的配置到 node-b 和 node-c 机器
集群每个机器上有相同的配置
1.3.4 启动和测试集群
通过 web 页面访问,在 0.98.x 之前,HMaster 的端口是 60010,HRegionServer 的端口是 60030,而之后的端口分别是 16010 和 16030。