搭建5节点hadoop+zookeeper+hbase+spark+kafka+storm(3):Hbase

本篇介绍Hbase集群安装。
版本:java 1.8,Hadoop 2.7.3,HBase 1.2.5,Zookeeper 3.4.10,Spark 2.1.1,Scala 2.12.2,Kafka 0.10.2.1,Storm 1.1.0。
以下操作都是以root用户进行,如需用户组和权限设定需自行配置。


1. 服务器信息及节点分配

服务器信息:

No Hostname 内网IP 外网IP OS
1 node01 192.168.5.11 192.168.205.50 Centos7
2 node02 192.168.5.12 192.168.205.62 Centos7
3 node03 192.168.5.13 192.168.205.63 Centos7
4 node04 192.168.5.14 192.168.205.70 Centos7
5 node05 192.168.5.15 192.168.205.102 Centos7

节点分配:

节点 node01 node02 node03 node04 node05
namenode YES YES NO NO NO
datanode NO NO YES YES YES
journalnode YES YES YES YES YES
zookeeper YES YES YES YES YES
hbase 主Master 备份Master RegionServer RegionServer RegionServer
spark YES YES YES YES YES
kafka YES YES YES YES YES
storm YES YES YES YES YES

2. 安装Hbase

2.1 下载安装包

1
wget http://mirror.bit.edu.cn/apache/hbase/1.2.6/hbase-1.2.6-bin.tar.gz

2.2 创建模板配置文件

需要修改的配置文件为hbase-env.sh,hbase-site.xml,regionservers。

2.2.1 hbase-site.xml

采用双HMaster配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://ctns/hbase</value><!--这里必须跟core-site.xml中的fs.defaultFS键配置一样-->
</property>
<!-- 开启分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--只配置端口,为了配置多个HMaster -->
<property>
<name>hbase.master</name>
<value>60000</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/usr/hbase/tmp</value>
</property>
<!--这里设置hbase API客户端侧缓存值,大于此值就进行一次提交,/opt/hbase-1.2.1/conf/hbase-site.xml统一配置为5M,对所有HTable都生效,那么客户端API就可不设置-->
<!--htable.setWriteBufferSize(5242880);//5M -->
<property>
<name>hbase.client.write.buffer</name>
<value>5242880</value>
</property>
<!--这里设置Master并发最大线程数,经常有人设为300左右-->
<property>
<name>hbase.regionserver.handler.count</name>
<value>20</value>
</property>
<!--
默认值 :256M
说明 :在当前ReigonServer上单个Reigon的最大存储空间,单个Region超过该值时,这个Region会被自动split成更小的region。
数据表创建时会预分区,每个预分区最大大小这里设置为10G,防止频繁的split阻塞数据读写,
只有当预分区超过10G时才会进行split,正式环境应该首先预测数据存储时间内的大致数据量,
然后如果每个预分区为10G,计算出分区数,建表时指定分区设置,防止后期频繁split
写法,如果你想设为128兆,但绝不可以写成128M这样,最安全的写法是128*1024*1024的数值,如下
-->
<property>
<name>hbase.hregion.max.filesize</name>
<value>134217728</value>
</property>
<!--
hbase本质上可以说是HADOOP HDFS的客户端,虽然Hadoop的core-site.xml里设置了文件副本数,但是仍然是客户端传值优先,这里设置为2,
意思是一个文件,最终在Hadoop上总个数为2,正式环境最好设置为3,目前发现此值小于3时,
在遇到All datanodes xxx.xxx.xxx.xxx:port are bad. Aborting...错误信息时,如果某个DataNode宕机,原则上hbase调用的DFSClient会去其他Datanode
上重试写,但发现配置的值低于3就不会去尝试
-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--
IncreasingToUpperBoundRegionSplitPolicy策略的意思是,数据表如果预分区为2,配置的memstore flush size=128M,那么下一次分裂大小是2的平方然后乘以128MB,即2*2*128M=512MB;
ConstantSizeRegionSplitPolicy策略的意思是按照上面指定的region大小超过30G才做分裂
-->
<property>
<name>hbase.regionserver.region.split.policy</name>
<value>org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy</value>
</property>
<!--一个edit版本在内存中的cache时长,默认3600000毫秒-->
<property>
<name>hbase.regionserver.optionalcacheflushinterval</name>
<value>7200000</value>
</property>
<!--分配给HFile/StoreFile的block cache占最大堆(-Xmx setting)的比例。默认0.3意思是分配30%,设置为0就是禁用,但不推荐。-->
<property>
<name>hfile.block.cache.size</name>
<value>0.3</value>
</property>
<!--当memstore的大小超过这个值的时候,会flush到磁盘。这个值被一个线程每隔hbase.server.thread.wakefrequency检查一下。-->
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>52428800</value>
</property>
<!--
默认值 :0.4/0.35
说明 :hbase.hregion.memstore.flush.size 这个参数的作用是当单个Region内所有的memstore大小总和超过指定值时,flush该region的所有memstore
单个region server的全部memtores的最大值。超过这个值,一个新的update操作会被挂起,强制执行flush操作。
以前版本中是通过hbase.regionserver.global.memstore.upperLimit设置,老版本中含义是在hbase-env.sh中配置的HEAP_SIZE比如4G,
那么以该值4G乘以配置的0.5就是2G,意思是所有memstore总和达到2G值时,阻塞所有读写,现在1.2.1版本hbase中被hbase.regionserver.global.memstore.size替代,
计算方法仍然是HEAP_SIZE乘以配置的百分比比如下面的0.5,那么阻塞读写的阀值就为2G
-->
<property>
<name>hbase.regionserver.global.memstore.size</name>
<value>0.5</value>
</property>
<!--
当强制执行flush操作的时候,当低于这个值的时候,flush会停止。
默认是堆大小的 35% . 如果这个值和 hbase.regionserver.global.memstore.upperLimit 相同就意味着当update操作因为内存限制被挂起时,
会尽量少的执行flush(译者注:一旦执行flush,值就会比下限要低,不再执行)。
在老版本中该值是通过hbase.regionserver.global.memstore.size.lower.limit设置,
计算方法是以hbase-env.sh的HEAP_SIZE乘以配置的百分比比如0.3就是HEAP_SIZE4G乘以0.3=1.2G,达到这个值的话就在所有memstore中选择最大的那个做flush动作,
新版本则完全不同了,首先是通过hbase.regionserver.global.memstore.lowerLimit设置,而且不是以HEAP_SIZE作为参考,
二是以配置的hbase.regionserver.global.memstore.size的值再乘以配置的比例比如0.5,如果HEAP_SIZE=4G,
hbase.regionserver.global.memstore.size配置为0.5,hbase.regionserver.global.memstore.size.lower.limit配置的为0.5,
则计算出来的值为4G乘以0.5再乘以0.5就是1G了,达到1G就先找最大的memstore触发flush
-->
<property>
<name>hbase.regionserver.global.memstore.size.lower.limit</name>
<value>0.5</value>
</property>
<!--这里设置HDFS客户端最大超时时间,尽量改大,后期hbase经常会因为该问题频繁宕机-->
<property>
<name>dfs.client.socket-timeout</name>
<value>600000</value>
</property>
<!--
hbase.table.sanity.checks是一个开关,主要用于hbase各种参数检查,当为true时候,检查步骤如下
1.check max file size,hbase.hregion.max.filesize,最小为2MB
2.check flush size,hbase.hregion.memstore.flush.size,最小为1MB
3.check that coprocessors and other specified plugin classes can be loaded
4.check compression can be loaded
5.check encryption can be loaded
6.Verify compaction policy
7.check that we have at least 1 CF
8.check blockSize
9.check versions
10.check minVersions <= maxVerions
11.check replication scope
12.check data replication factor, it can be 0(default value) when user has not explicitly set the value, in this case we use default replication factor set in the file system.
详细情况可以去查看源代码org.apache.hadoop.hbase.master.HMaster的方法sanityCheckTableDescriptor,
该代码位于hbase源码的模块hbase-server下
-->
<property>
<name>hbase.table.sanity.checks</name>
<value>false</value>
</property>
<!--ZooKeeper 会话超时.HBase把这个值传递改zk集群,向他推荐一个会话的最大超时时间-->
<property>
<!--every 30s,the master will check regionser is working -->
<name>zookeeper.session.timeout</name>
<value>30000</value>
</property>
<!--
Hbase的外置zk集群时,使用下面的zk端口。因为我这5台机子打算都安装hbase,所以都指定zookeeper。
-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181,node04:2181,node05:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/zookeeper/data</value>
</property>
</configuration>

2.2.2 hbase-env.sh

添加如下变量:

1
2
3
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-3.b12.el7_3.x86_64/jre
export HBASE_CLASSPATH=/usr/hadoop/etc/hadoop
export HBASE_MANAGES_ZK=false

2.2.3 regionservers

1
2
3
node03
node04
node05

2.3 安装部署

部署时需要替换hbase的lib中版本不一致的hadoop相关jar包,如果使用了hadoop HA别名的话需要在hbase/conf下建立hdfs-site.xml和core-site.xml的软连接,写一个简易部署脚本:

hbase.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#/bin/bash

tar -xvf ./hbase-1.2.6-bin.tar.gz
mv ./hbase-1.2.6 /usr/hbase

mv /usr/hbase/lib/hadoop-annotations-2.5.1.jar /usr/hbase/lib/hadoop-annotations-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-auth-2.5.1.jar /usr/hbase/lib/hadoop-auth-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-common-2.5.1.jar /usr/hbase/lib/hadoop-common-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-client-2.5.1.jar /usr/hbase/lib/hadoop-client-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-hdfs-2.5.1.jar /usr/hbase/lib/hadoop-hdfs-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-mapreduce-client-jobclient-2.5.1.jar /usr/hbase/lib/hadoop-mapreduce-client-jobclient-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-mapreduce-client-app-2.5.1.jar /usr/hbase/lib/hadoop-mapreduce-client-app-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-mapreduce-client-shuffle-2.5.1.jar /usr/hbase/lib/hadoop-mapreduce-client-shuffle-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-mapreduce-client-common-2.5.1.jar /usr/hbase/lib/hadoop-mapreduce-client-common-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-mapreduce-client-core-2.5.1.jar /usr/hbase/lib/hadoop-mapreduce-client-core-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-yarn-server-common-2.5.1.jar /usr/hbase/lib/hadoop-yarn-server-common-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-yarn-common-2.5.1.jar /usr/hbase/lib/hadoop-yarn-common-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-yarn-api-2.5.1.jar /usr/hbase/lib/hadoop-yarn-api-2.5.1.jar.bak
mv /usr/hbase/lib/hadoop-yarn-client-2.5.1.jar /usr/hbase/lib/hadoop-yarn-client-2.5.1.jar.bak

cp /usr/hadoop/share/hadoop/common/lib/hadoop-auth-2.7.3.jar /usr/hbase/lib/hadoop-auth-2.7.3.jar
cp /usr/hadoop/share/hadoop/common/lib/hadoop-annotations-2.7.3.jar /usr/hbase/lib/hadoop-annotations-2.7.3.jar
cp /usr/hadoop/share/hadoop/common/hadoop-common-2.7.3.jar /usr/hbase/lib/hadoop-common-2.7.3.jar
cp /usr/hadoop/share/hadoop/hdfs/hadoop-hdfs-2.7.3.jar /usr/hbase/lib/hadoop-hdfs-2.7.3.jar
cp /usr/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.3.jar /usr/hbase/lib/hadoop-mapreduce-client-jobclient-2.7.3.jar
cp /usr/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-app-2.7.3.jar /usr/hbase/lib/hadoop-mapreduce-client-app-2.7.3.jar
cp /usr/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-shuffle-2.7.3.jar /usr/hbase/lib/hadoop-mapreduce-client-shuffle-2.7.3.jar
cp /usr/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.7.3.jar /usr/hbase/lib/hadoop-mapreduce-client-common-2.7.3.jar
cp /usr/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.3.jar /usr/hbase/lib/hadoop-mapreduce-client-core-2.7.3.jar
cp /usr/hadoop/share/hadoop/yarn/hadoop-yarn-server-common-2.7.3.jar /usr/hbase/lib/hadoop-yarn-server-common-2.7.3.jar
cp /usr/hadoop/share/hadoop/yarn/hadoop-yarn-common-2.7.3.jar /usr/hbase/lib/hadoop-yarn-common-2.7.3.jar
cp /usr/hadoop/share/hadoop/yarn/hadoop-yarn-api-2.7.3.jar /usr/hbase/lib/hadoop-yarn-api-2.7.3.jar
cp /usr/hadoop/share/hadoop/yarn/hadoop-yarn-client-2.7.3.jar /usr/hbase/lib/hadoop-yarn-client-2.7.3.jar
#移除HBase里面的不必要log4j的jar包
mv /usr/hbase/lib/slf4j-log4j12-1.7.5.jar /usr/hbase/lib/slf4j-log4j12-1.7.5.jar.bak

cp -rf ./hbase-env.sh /usr/hbase/conf/hbase-env.sh
cp -rf ./hbase-site.xml /usr/hbase/conf/hbase-site.xml
cp -rf ./regionservers /usr/hbase/conf/regionservers

mkdir /usr/hbase/tmp
#创建软连接,识别hadoop HA别名
ln -s /usr/hadoop/etc/hadoop/hdfs-site.xml /usr/hbase/conf/hdfs-site.xml
ln -s /usr/hadoop/etc/hadoop/core-site.xml /usr/hbase/conf/core-site.xml

echo "export HBASE_HOME=/usr/hbase" >> /root/.bash_profile
echo "export PATH=\$HBASE_HOME/bin:\$PATH" >> /root/.bash_profile

修改权限并执行,执行时确保hbase-env.sh,hbase-site.xml,regionservers,hbase-1.2.6-bin.tar.gz,hbase.sh在同一目录下:
1
2
3
chmod +x ./hbase.sh
./hbase.sh
source /root/.bash_profile

2.4 部署所有节点

使用sftp将hbase-env.sh,hbase-site.xml,regionservers,hbase-1.2.6-bin.tar.gz,hbase.sh传到其他所有节点上并按照以上步骤进行部署。


3. Hbase启动

在启动之前将ZooKeeper和Hadoop启动。

3.1 在node01执行以下命令

1
start-hbase.sh

3.2 在node02执行以下命令

1
hbase-daemon.sh start master

3.3 查看相应进程

在node01和node02上用jps查看是否有HMaster进程,在node03, node04和node05上用jps查看是否有HRegionServer进程。


4. 测试验证

4.1 节点状态

查看hbase状态http://192.168.205.50:16010/:

4.2 hbase shell测试

4.2.1 进入hbase shell命令行:

1
hbase shell

4.2.2 建立一个表,具有三个列族member_id 、address、info:

1
create 'member','member_id','address','info'

4.2.3 查看当前HBase中具有哪些表:

1
list

4.2.4 查看表的构造:

1
describe 'member' 


4.2.5 删除member表:

1
disable 'member' 


1
drop 'member' 

4.2.6 退出shell:

1
exit

参照资料:
Hbase HA 分布式搭建
在hadoop2.8的HA+zookeeper的环境下安装分布式HBase 1.2.5
HBase安装配置之完全分布式模式