一、安装Hbase前提条件
1)JDK和HDFS集群已经安装了。
2)打通Mster->Slave的SSH免秘钥登录(安装HDFS时Hadoop用户已经打通)。
3)所有主机的NTP时间要一致(安装HDFS集群时已经设置一致)。
4)ULIMIT和NPROC要调大(安装HDFS集群时已经调整)。
5)安装Zookeeper集群,一个分布式运行的Hbase依赖一个zookeeper集群,所有的节点能够访问zookeeper。
6)修改HDFS的DataNode同时最大处理文件。
一个Hadoop HDFS Datanode有一个同时处理文件的上限,配置conf/hdfs-site.xml里面的xceivers参数,至少要有4096:
1 2 3 4 |
<property> <name>dfs.datanode.max.xcievers</name> <value>4096</value> </property> |
对于HDFS修改配置要记得重启。
我这里是是接着:Hadoop实战:Hadoop分布式集群部署开始Hbase的部署操作的。
Hbase测试环境清单
角色 | 主机名 | 地址 | 系统 | 硬件 |
HMaster,Zookeeper | hadoop-nn | 10.10.0.186 | CentOS 7.2 | 8核8G |
HRegionServer,Zookeeper | hadoop-snn | 10.10.0.187 | CentOS 7.2 | 8核8G |
HRegionServer,Zookeeper | hadoop-dn-01 | 10.10.0.188 | CentOS 7.2 | 8核8G |
二、安装Zookeeper集群
运行Zookeeper的独立模式方便评估、开发和测试。但是在生产中,对于可靠的Zookeeper服务,你应该部署Zookeeper在一个集群环境里。只要集群的多数服务可用,集群服务就是可用的。因为Zookeeper要求一个大多数,进群最好使用奇数个机器。例如,4台主机的Zookeeper只可以处理单机的故障;如果两个主机故障,剩下的两个机器不能成为大多数。然而,5台主机的Zookeeper可以处理两个机器的故障。
安装二进制版本的zookeeper
1 2 3 4 |
$ tar xvf zookeeper-3.4.9.tar.gz -C /usr/local/ $ ln -s /usr/localzookeeper-3.4.9/ /usr/local/zookeeper $ cd /usr/local/zookeeper/conf $ cp zoo_sample.cfg zoo.cfg |
设置Java堆大小。这对于避免swapping非常重要,它将严重降低Zookeeper的性能。确定正确值,使用负载测试,并确定低于引起swap的的限制。保守的 – 对于4GB的机器使用最大堆大小3GB。
所有服务器有相同的配置文件副本,配置文件和使用独立模式相似,但有一点点的区别,如:编辑zookeeper配置文件/usr/local/zookeeper/conf/zoo.cfg
1 2 3 4 5 6 7 8 9 10 11 |
maxClientCnxns=60 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/db dataLogDir=/data/zookeeper/log clientPort=2181 # cluster configure server.1=10.10.0.186:2888:3888 server.2=10.10.0.187:2888:3888 server.3=10.10.0.188:2888:3888 |
1 |
$ mkdir /data/zookeeper/{db,log} -p |
参数解释:
tickTime:Zookeeper使用的基本时间,时间单位为毫秒。它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间
dataDir:保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。
dataLogDir:日志保存目录。Zookeeper的日志信息使用log4j。更多详细信息可以在开发人员指南的 Logging 模块获取。你可以根据log4j的配置进入控制台查看日志信息(或日志文件)。
clientPort:监听客户端连接的端口。
initLimit:是Zookeeper用它来限定quorum中的Zookeeper服务器连接到Leader的超时时间。
syncLimit:限制了一个服务器从Leader多长时间超时。使用这两种超时,你指定的时间单位使用tickTime.在这个例子中,initLimit的超时时间是5个标记号,2000毫秒一个标记,就是10秒。
server.x:列出了构成Zookeeper服务的服务器,当服务启动时,它通过查找data目录中的myid文件知道是哪个服务,这个myid个文件包含了服务号,用ASCII。
最后,注意每个服务器名称(用IP或主机名,最好使用主机名,然后再hosts文件中做绑定)后面的两个端口号:”2888″和”3888″。其中2888表示zookeeper程序监听端口,3888表示zookeeper选举通信端口。节点使用前面的端口连接到其他节点。这样的一个连接非常重要,以便于节点之间可以通讯,例如,对更新的顺序取得统一的意见。更具体的说,一个Zookeeper的服务器用这个端口连接follower到leader。当一个新的leader产生时,follower使用这个端口打开一个TCP连接,连接到leader。因为默认的leader选举也使用TCP。我们现在需要另一个端口用来leader选举。这是在服务器条目的第二个端口。
下面需要生成ID,这里需要注意,myid对应的zoo.cfg的server.ID,比如第二台zookeeper主机对应的myid应该是2,以此类推,三个主机分别为:
1 2 3 |
[root@hadoop-nn ~]# echo 1 > /data/zookeeper/db/myid [root@hadoop-snn ~]# echo 2 > /data/zookeeper/db/myid [root@hadoop-dn-01 ~]# echo 3 > /data/zookeeper/db/myid |
然后输出环境变量。
1 2 |
$ export PATH=$PATH:/usr/local/zookeeper/bin/ $ source /etc/profile |
然后就可以在集群中的每个主机上启动zookeeper了。
1 |
$ zkServer.sh start |
查看各个zookeeper节点的状态(会有一个leader节点,两个follower节点)。
1 2 3 4 5 6 |
[root@hadoop-nn ~]# zkServer.sh status Mode: follower [root@hadoop-snn ~]# zkServer.sh status Mode: leader [root@hadoop-dn-01 ~]# zkServer.sh status Mode: follower |
客户端连接,可以查看相关信息。
1 2 |
$ zkCli.sh -server 127.0.0.1:2181 [zk: 127.0.0.1:2181(CONNECTED) 0] |
至此,zookeeper集群模式已经搞定了。
三、安装配置Hbase集群
当条件都满足时,自行去官网下载Hbase的二进制安装包,然后就可以进行解压了。
1 2 3 |
$ tar xvf hbase-1.2.5-bin.tar.gz -C /usr/local/ $ ln -sv /usr/local/hbase-1.2.5-bin /usr/local/hbase $ mkdir /usr/local/hbase/logs |
为了方便,我们这里赋予Hbase属主和属组为Hadoop(因为Hadoop用户的SSH已经打通),后面所有操作都切换到Hadoop用户进行。
1 |
$ chown hadoop.hadoop -R /usr/local/hbase/* |
配置hbase-env.sh,关闭Hbase自带的Zookeeper。
1 2 |
[hadoop@hadoop-nn ~]# cat /usr/local/hbase/conf/hbase-env.sh export HBASE_MANAGES_ZK=false |
修改conf/hbase-env.sh里面的HBASE_MANAGES_ZK参数来切换是否使用Hbase自带zookeeper,这个值默认是true的,作用是让Hbase启动的时候同时也启动zookeeper。我这里改成FALSE了,使用我们自己配置的zookeeper。
配置hbase-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[hadoop@hadoop-nn ~]# cat /usr/local/hbase/conf/hbase-site.xml <configuration> <property> <name>hbase.rootdir</name> <value>hdfs://10.10.0.186:8020/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>10.10.0.186,10.10.0.187,10.10.0.188</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/hadoop/zookeeper</value> </property> </configuration> |
hbase.rootdir:这个目 录是region server的共享目录,用来持久化Hbase。URL需要是’完全正确’的,还要包含文件系统的scheme。例如,要表示hdfs中的’/hbase’目录,namenode 运行在node1的49002端口。则需要设置为hdfs://node1:49002/hbase。默认情况下Hbase是写到/tmp的。不改这个配 置,数据会在重启的时候丢失。默认: file:///tmp/hbase-${user.name}/hbase
hbase.cluster.distributed:Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面。
默认: false
在hbase-site.xml配置zookeeper:
当Hbase管理zookeeper的时候,你可以通过修改zoo.cfg来配置zookeeper,
一个更加简单的方法是在 conf/hbase-site.xml里面修改zookeeper的配置。Zookeeer的配置是作为property写在 hbase-site.xml里面的。
对于zookeepr的配置,你至少要在 hbase-site.xml中列出zookeepr的ensemble servers,具体的字段是 hbase.zookeeper.quorum.该这个字段的默认值是 localhost,这个值对于分布式应用显然是不可以的. (远程连接无法使用)。
hbase.zookeeper.property.clientPort:ZooKeeper的zoo.conf中的配置。 客户端连接的端口。
hbase.zookeeper.quorum:Zookeeper 集群的地址列表,用逗号分割。例 如:”host1.mydomain.com,host2.mydomain.com,host3.mydomain.com”.默认是 localhost,是给伪分布式用的。要修改才能在完全分布式的情况下使用。如果在hbase-env.sh设置了HBASE_MANAGES_ZK, 这些ZooKeeper节点就会和Hbase一起启动。
默认: localhost
运行一个zookeeper也是可以的,但是在生产环境中,你最好部署3,5,7个节点。部署的越多,可靠性就 越高,当然只能部署奇数个,偶数个是不可以的。你需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘。 (独立磁盘可以确保zookeeper是高性能的。).如果你的集群负载很重,不要把Zookeeper和RegionServer运行在同一台机器上 面。就像DataNodes 和 TaskTrackers一样
配置regionservers
完全分布式模式的还需要修改conf/regionservers,在这里列出了你希望运行的全部HRegionServer,一行写一个host (就像Hadoop里面的 slaves 一样),列在这里的server会随着集群的启动而启动,集群的停止而停止。
1 2 3 |
[hadoop@hadoop-nn ~]# cat /usr/local/hbase/conf/regionservers hadoop-snn hadoop-dn-01 |
同步配置到regionservers
1 2 |
$ scp /usr/local/hbase/conf/* hadoop@hadoop-snn:/usr/local/hbase/conf/ $ scp /usr/local/hbase/conf/* hadoop@hadoop-dn-01:/usr/local/hbase/conf/ |
启动Hbase
1 2 3 4 5 6 7 8 9 10 |
[hadoop@hadoop-nn ~]$ start-hbase.sh starting master, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-master-hadoop-nn.out OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 hadoop-snn: starting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-regionserver-hadoop-snn.out hadoop-dn-01: starting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-regionserver-hadoop-dn-01.out hadoop-snn: OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 hadoop-snn: OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 hadoop-dn-01: OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 hadoop-dn-01: OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 |
通过JPS命令查看一下进程是否启动
1 2 3 4 5 6 7 8 9 10 |
[root@hadoop-nn ~]# jps 17552 Jps 6017 DataNode 5862 NameNode 6200 SecondaryNameNode 4602 QuorumPeerMain 15323 ResourceManager 3243 RunJar 15453 NodeManager 17262 HMaster |
1 2 3 4 5 6 |
[root@hadoop-snn ~]# jps 23488 HRegionServer 12418 DataNode 23714 Jps 12259 QuorumPeerMain 10415 NodeManager |
看到Hmaster和HRegionServer说明Hbase启动已经好了。
可以到HDFS集群看到/hbase的目录,文件如下:
1 2 3 4 5 6 7 8 9 |
[hadoop@hadoop-nn ~]$ hdfs dfs -ls /hbase Found 7 items drwxr-xr-x - hadoop supergroup 0 2017-06-19 01:22 /hbase/.tmp drwxr-xr-x - hadoop supergroup 0 2017-06-19 01:22 /hbase/MasterProcWALs drwxr-xr-x - hadoop supergroup 0 2017-06-19 01:22 /hbase/WALs drwxr-xr-x - hadoop supergroup 0 2017-06-18 23:32 /hbase/data -rw-r--r-- 2 hadoop supergroup 42 2017-06-18 23:18 /hbase/hbase.id -rw-r--r-- 2 hadoop supergroup 7 2017-06-18 23:18 /hbase/hbase.version drwxr-xr-x - hadoop supergroup 0 2017-06-19 01:21 /hbase/oldWALs |
查看Zookeeper,也可以看到一个Hbase目录:
1 2 3 |
[hadoop@hadoop-nn ~]$ zkCli.sh -server 127.0.0.1:2181 [zk: 127.0.0.1:2181(CONNECTED) 0] ls / [zookeeper, hbase] |
此时,可以通过Hmaster的16010端口通过Web界面查看相关信息:
可以在Hbase Shell停止Hbase
1 2 |
$ stop-hbase.sh stoppinghbase............... |
停止操作需要一些时间,你的集群越大,停的时间可能会越长。如果你正在运行一个分布式的操作,要确认在Hbase彻底停止之前,Hadoop不能停。
四、Hbase Shell
一旦 Hbase 启动,就可以进行建表,插入数据,scan 你的表,还有 disable 这个表,最后把它删掉。
用 shell 连接你的 Hbase
1 2 |
$ hbase shell hbase(main):001:0> |
输入 help 然后 <RETURN> 可以看到一列 shell 命令。这里的帮助很详细,要注意的是表名,行和列需要加引号。创建一个名为 hbase_table 的表,这个表只有一个column family 为 cf。可以列出所有的表来检查创建情况,然后插入些值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 创建表; hbase(main):037:0> create 'hbase_table','cf' 0 row(s) in 1.2130 seconds => Hbase::Table - hbase_table # 列出表; hbase(main):015:0> list TABLE hbase_table 1 row(s) in 0.0040 seconds => ["hbase_table"] # 上传数据; hbase(main):039:0> put 'hbase_table','row1', 'cf:a', 'value1' 0 row(s) in 0.0140 seconds hbase(main):040:0> put 'hbase_table','row2', 'cf:b', 'value2' 0 row(s) in 0.0070 seconds hbase(main):042:0> put 'hbase_table','row3', 'cf:c', 'value3' 0 row(s) in 0.0040 seconds |
以上我们分别插入了 3 行。第一个行 key 为 row1,列为 cf:a,值是 value1。Hbase 中的列是由 column family 前缀和列的名字组成的,以冒号间隔。例如这一行的列名就是 a。
检查插入情况,Scan 这个表,操作如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 扫描所有表; hbase(main):043:0> scan 'hbase_table' ROW COLUMN+CELL row1 column=cf:a, timestamp=1497851116154, value=value1 row2 column=cf:b, timestamp=1497851139154, value=value2 row3 column=cf:c, timestamp=1497851157456, value=value3 3 row(s) in 0.0120 seconds # 获取某条记录; hbase(main):044:0> get 'hbase_table','row1' COLUMN CELL cf:a timestamp=1497851116154, value=value1 1 row(s) in 0.0240 seconds |
disable 再 drop 这张表,可以清除你刚刚的操作。
1 2 3 4 5 |
hbase(main):019:0> disable 'hbase_table' 0 row(s) in 2.2490 seconds hbase(main):020:0> drop 'hbase_table' 0 row(s) in 1.2350 seconds |
最后 exit 退出 shell。
1 |
hbase(main):045:0> exit |
完结。。。