本节书摘来自华章出版社《HBase企业应用开发实战》一 书中的第2章,第2.2节,作者:马延辉 孟鑫 李立松 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
HBase有两种运行模式:单机模式和分布式模式。在默认情况下HBase运行在单机模式下,如果要运行分布式模式的HBase,需要编辑安装目录下conf文件夹中相关的配置文件。
不管运行在什么模式下,都需要编辑安装包的conf目录下的hbase-env.sh文件来告知HBase Java的安装路径。在这个文件中还可以设置HBase的运行环境,诸如Heap Size和其他有关JVM的选项,还有日志文件保存目录、进程优先级等。最重要的是设置JAVA_HOME指向Java安装的路径,在该文件中搜索JAVA_HOME,找到如下一行:
# export JAVA_HOME=/usr/java/jdk1.6.0/
去掉前面的#注释,将JAVA_HOME配置为实际的Java安装路径。
这是HBase默认的运行模式,在单机模式中,HBase使用本地文件系统,而不是HDFS,所有的服务和ZooKeeper都运行在一个JVM中。ZooKeeper监听一个端口,这样客户端就可以连接HBase了。
1.?配置JDK
需要安装64位版本的JDK,推荐Oracle公司的发行版,可以在www.oracle.com/us/downloads下载并安装,同时在环境变量中设置JAVA_HOME和Classpath。
2.?HBase安装
在Apache的网站上下载一个稳定版本的安装包,可以在这里找到www.apache.org/dyn/closer.cgi/hbase/,本书使用的版本是0.94.18。
在待安装的目录下解压缩安装包:
tar zxf hbase-0.94.18.tar.gz
除了在安装包的conf目录下修改hbase-env.sh的JAVA_HOME外,还需要修改该目录下的hbase-site.xml文件,示例如下:
hbase.rootdir
file:///DIRECTORY/hbase
hbase.zookeeper.property.dataDir
/DIRECTORY/zookeeper
其中:
hbase.rootdir代表HBase数据存放的位置,单机模式下存储到本地目录。
hbase.zookeeper.property.dataDir代表ZooKeeper数据存放的位置。
3.?启动HBase
运行如下脚本启动HBase:
bin/start-hbase.sh
启动成功后通过JPS命令应该可以看到如下信息:
4496 HMaster
通过如下命令可以连接到HBase表示安装成功:
bin/hbase shell
连接成功后显示:
HBase Shell; enter 'help' for list of supported commands.
Type "exit" to leave the HBase Shell
Version 0.94.18, r1577788, Sat Mar 15 04:46:47 UTC 2014
hbase(main):001:0>
HBase分布式模式有两种。伪分布式模式是把所有进程运行在一台机器上,但不是一个JVM上;而完全分布式模式就是把整个服务分布在各个节点上。无论采用哪种分布式模式,都需要使用HDFS。在操作HBase之前,要确认HDFS可以正常运行。
在安装HBase之后,需要确认伪分布式模式或完全分布式模式的配置是否正确,这两种模式可以使用相同的验证脚本。
1.?伪分布式模式
伪分布式模式是一个相对简单的分布式模式,是用于测试的。不能把这个模式用于生产环节,也不能用于测试性能。
确认HDFS安装成功之后,就可以先编辑安装包conf目录下的hbase-site.xml。在这个文件中可以加入自己的配置,这个配置会覆盖HBase默认配置(默认配置在hbase-default.xml中)。运行HBase需要设置hbase.rootdir属性。该属性是指HBase在HDFS中使用的目录的位置。例如,HBase根目录是/hbase,NameNode监听locahost的9000端口,只有一份数据副本(HDFS默认是3份副本)。可以在hbase-site.xml写上如下内容:
hbase.rootdir
hdfs://localhost:9000/hbase
dfs.replication
1
由HBase自己创建hbase.rootdir。上面HDFS绑定到localhost,也就是说除了本机,其他机器连不上HBase。所以需要将localhost设置成主机名,其他机器才能访问它。
(1)启动HBase
可以使用如下命令启动HBase:
bin/start-hbase.sh
也可以在同一服务器启动额外备份HMaster:
bin/local-master-backup.sh start 1
“1”表示使用端口60001和60011,该备份的HMaster及其日志文件放在logs/hbase-${USER}-1-master-${HOSTNAME}.log中。
启动多个备份HMaster:
bin/local-master-backup.sh start 2 3
可以启动9个备份HMaster,最多可以有10个HMaster。
如果要启动更多RegionServer,可以执行如下命令:
bin/local-regionservers.sh start 1
“1”表示使用端口60201和60301,日志文件存放在logs/hbase-${USER}-1-regionserver$-{HOSTNAME}.log中。
在刚运行的RegionServer上增加4个额外RegionServer,最多可以支持100个。
bin/local-regionservers.sh start 2 3 4 5
(2)停止HBase
假设想停止备份HMaster 1,运行如下命令:
cat /${PID_DIR}/hbase-${USER}-1-master.pid |xargs kill -9
停止RegionServer,可以运行如下命令:
bin/local-regionservers.sh stop 1
2.?分布式模式
(1)安装ZooKeeper
下载stable版本的ZooKeeper,可以在Apache官方网站下载,地址是http://www.apache. org/dyn/closer.cgi/zookeeper/,本书使用的是3.4.5版本。
解压缩安装包:
tar zxf zookeeper-3.4.5.tar.gz
将安装包conf目录下的zoo_sample.cfg文件复制一份,命名为zoo.cfg。
修改zoo.cfg配置文件,示例如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/hadoop/zookeeper-3.4.5/zookeeperdir/zookeeper-data
dataLogDir=/home/hadoop/zookeeper-3.4.5/zookeeperdir/logs
# the port at which the clients will connect
clientPort=2181
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
# 2888,3888 are election port
server.1=host1:2888:3888
其中,2888是ZooKeeper服务之间通信的端口,而3888是ZooKeeper与其他应用程序通信的端口。
initLimit:这个配置项用来配置ZooKeeper接收客户端(这里所说的客户端不是用户连接ZooKeeper服务器的客户端,而是ZooKeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。这里设置为10,说明如果超过10个心跳时间(也就是10倍tickTime)长度后ZooKeeper服务器还没有收到客户端的返回信息,就表明这个客户端连接失败。总的时间长度就是10×2000=20(s)。
syncLimit:这个配置项标识Leader与Follower之间发送消息时请求和应答时间长度,最长不能超过多少个tickTime的时间长度,这里设置为5,表明总的时间长度就是5×2000=10(s)。
server.A=B:C:D:其中A是一个数字,表示这是第几号服务器;B是这台服务器的IP地址;C表示的是这台服务器与集群中的Leader服务器交换信息的端口;D表示的是万一集群中的Leader服务器死机了,需要一个端口来重新进行选举,选出一个新的Leader服务器,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于B都是一样的,因此不同的ZooKeeper实例通信端口不能一样,要为它们分配不同的端口。
创建dataDir参数指定的目录(这里指的是/home/hadoop/zookeeper-3.4.5/zookeeperdir/zookeeper-data),并在此目录下创建文件,命名为myid。
编辑myid文件,并在对应的主机名的机器上输入对应的编号。例如,在host1上,myid文件内容就是1。由于本次只在单点上进行安装配置,所以只有一个server.1。若还有其他服务器,比如主机名为host2,则在zoo.cfg文件中还需加入server.2=host2:2888:3888,那么myid文件在host2服务器上的内容就是2。至此,如果是多服务器配置,只需要将zookeeper-3.4.5目录复制到其他服务器,然后按照上述方法修改myid。
设置环境变量:
export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.5
PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH
(2)启动并测试ZooKeeper
在所有服务器中执行:
zkServer.sh start
使用jps命令查看进程:
19361 QuorumPeerMain
其中,QuorumPeerMain是ZooKeeper进程,说明启动正常。
查看服务状态命令:
zkServer.sh status
打印输出结果:
JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: standalone
启动客户端脚本:
zkCli.sh -server host1:2181
停止ZooKeeper进程:
zkServer.sh stop
(3)配置HBase
一个分布式运行的Hbase依赖一个ZooKeeper集群。所有的节点和客户端都必须能够访问ZooKeeper。在默认情况下,HBase会管理一个ZooKeeper集群。这个集群会随着HBase的启动而启动。当然,也可以自己管理一个ZooKeeper集群,需要修改conf/hbase-env.sh中的HBASE_MANAGES_ZK来切换。HBASE_MANAGES_ZK的默认值是true,作用是让HBase启动的同时也启动ZooKeeper。
让HBase使用一个现有的不被HBase托管的ZooKeeper集群,需要设置conf/hbase-env.sh文件中的HBASE_MANAGES_ZK属性为false。由于本书中使用HBase管理ZooKeeper,因此hbase-env.sh中配置如下:
export HBASE_MANAGES_ZK=true
(4)配置hbase-site.xml
hbase.rootdir
hdfs://host1:9000/hbase
hbase.cluster.distributed
true
hbase.zookeeper.property.clientPort
2181
hbase.zookeeper.quorum
host1,host2,host3
hbase.zookeeper.property.dataDir
/home/hadoop/zookeeperdata
hbase.rootdir:这个目录是RegionServer的共享目录,用来持久化HBase。URL需要是“完全正确”的,还要包含文件系统的scheme。例如,“/hbase”表示HBase在HDFS中占用的实际存储目录,HDFS的NamenoNde运行在主机名为host1的9000端口,则hbase.rootdir的设置应为hdfs://host1:9000/hbase。在默认情况下HBase是写到/tmp中的。不修改这个配置,数据会在重启的时候丢失。默认为file:///tmp/hbase-${user.name}/hbase。
hbase.cluster.distributed:HBase的运行模式。为false表示单机模式,为true表示分布式模式。若为false,HBase和ZooKeeper会运行在同一个JVM中。默认值是false。
当HBase管理ZooKeeper的时候,可以通过修改zoo.cfg来配置ZooKeeper。一个更加简单的方法是在conf/hbase-site.xml中修改ZooKeeper的配置。ZooKeeper的配置作为property写在hbase-site.xml中。
对于ZooKeeper的配置,至少要在hbase-site.xml中列出全部的ZooKeeper的主机,具体的参数是hbase.zookeeper.quorum,该属性的默认值是localhost,这个值对于分布式应用显然是不可用的(远程连接无法使用)。
ZooKeeper集群的地址列表用逗号分隔,例如:“host1,host2,host3”。默认是localhost,是供伪分布式模式使用的,修改才能在完全分布式模式下使用。如果在hbase-env.sh中设置HBASE_MANAGES_ZK为true,这些ZooKeeper节点就会和Hbase一起启动。
hbase.zookeeper.property.clientPort:表示客户端连接ZooKeeper的端口。
运行只有1台主机的ZooKeeper也是可以的,但是在生产环境中,最好部署3、5、7个节点。部署得越多,可靠性就越高,当然只能部署奇数个,偶数个是不可以的。需要分配给每个ZooKeeper 1GB左右的内存,有可能的话最好分配独立的磁盘。(独立磁盘可以确保ZooKeeper是高性能的。)如果集群负载很重,不要把ZooKeeper和RegionServer运行在同一台机器上。
base.zookeeper.property.dataDir:这个参数用于设置ZooKeeper快照的存储位置。默认值是/tmp,在操作重启的时候该目录会被清空,应该修改默认值到其他目录,可以修改到/home/hadoop/zookeeperdata(这个路径需要运行HBase的用户拥有读写操作权限)。
对于独立的ZooKeeper,要指明ZooKeeper的主机和端口,可以在hbase-site.xml中设置,也可以在HBase的CLASSPATH下面加一个zoo.cfg配置文件。HBase会优先加载zoo.cfg中的配置,覆盖hbase-site.xml中的。
(5)配置regionservers文件
在完全分布式模式下还需要修改安装包的conf目录下的regionservers文件。在这里列出了希望运行的全部RegionServer,一行写一个主机名(就像Hadoop中的slaves一样)。这里列出的Server会随着集群的启动而启动,集群的停止而停止。
regionservers文件示例:
host1
host2
(6)替换Hadoop的jar包
复制Hadoop安装路径的lib目录下的hadoop-core-*.jar包到HBase的lib目录下覆盖HBase自带的Hadoop jar包,否则HBase集群在运行时可能出现一些难以解决的问题。
(7)运行HBase
当ZooKeeper由HBase托管的时候,Zookeeper集群的启动是Hbase启动脚本的一部分。
首先确认HDFS是运行着的,然后用如下命令启动HBase:
bin/start-hbase.sh
这个脚本在HBASE_HOME的bin目录中。现在HBase已经启动了。HBase把log记在logs子目录中,当Hbase启动出问题的时候,可以查看log文件。
HBase有一个Web界面,上面会列出重要的属性。该Web应用默认启动在HBase HMaster的60010端口上(HBase的RegionServer会默认绑定60020端口,在端口60030上有一个展示信息的界面)。如果Master运行在host1,端口是默认的,可以在浏览器输入http://host1:60010后看到主界面。
一旦HBase启动,可以使用命令创建表,插入数据,扫描数据表,还有禁用这个表,最后把它删掉。
可以通过如下脚本停止HBase集群:
$./bin/stop-hbase.sh
停止操作需要一些时间,而且集群越大,停的时间可能会越长。如果正在运行一个分布式的操作,要确认在Hbase彻底停止之前,Hadoop不能停止。
可以使用如下命令单独启动或停止ZooKeeper而不启动Hbase:
${HBASE_HOME}/bin/hbase-daemons.sh {start,stop} zookeeper
(8)验证安装
可以使用jps命令查看进程,在HMaster上:
8371 HMaster
8314 HQuorumPeer
在RegionServer节点上:
4256 HRegionServer
4594 HQuorumPeer