hbase 部署

环境信息

使用的 hadoop 完全分布式集群,节点限制,全安装在一起 用户 hadoop

1
2
3
192.168.2.241 hadoop01 # HBase master, RegionServer
192.168.2.242 hadoop02 # HBase master, RegionServer
192.168.2.243 hadoop03 # HBase client, RegionServer

HMaster: 作为一个管理节点,主要实现对 RegionServer 的监控、处理 RegionServer 故障转移、处理元数据的变更、处理 region 的分配或转移、在空闲时间进行数据的负载均衡、通过 ZooKeeper 发布自己的位置给客户端等功能。

HRegionServer: 负责 table 数据的实际读写,管理 Region。

在 HBase 分布式集群中,HRegionServer 一般跟 DataNode 在同一个节点上,目的是实现数据的本地性,提高读写效率。

Hbase 安装

注意版本匹配 https://hbase.apache.org/book.html#basic.prerequisites

官网https://hbase.apache.org/downloads.html

所有节点执行, 安装以及配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wget --no-check-certificate  https://archive.apache.org/dist/hbase/2.4.12/hbase-2.4.12-bin.tar.gz

mkdir -p /opt/bigdata/hbase
tar zxvf hbase-2.4.12-bin.tar.gz -C /opt/bigdata/hbase/
cd /opt/bigdata/hbase/
ln -s hbase-2.4.12 current

chown -R hadoop:hadoop /opt/bigdata/hbase/

cat > /etc/profile.d/hbase_env.sh<<-eof
export HBASE_HOME=/opt/bigdata/hbase/current
export HBASE_CONF_DIR=/etc/hbase/conf
export PATH=\$PATH:\$HBASE_HOME/bin
eof

修改配置文件
创建文件夹

1
mkdir /etc/hbase/conf

放入以下文件

  1. hbase-env.sh
  2. hbase-site.xml
  3. regionservers
  4. hdfs-site.xml
  5. backup-masters

hbase-env.sh : 用来设置 HBase 的一些 Java 环境变量信息,以及 JVM 内存信息

1
2
3
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xmx10g -XX:ReservedCodeCacheSize=256m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xmx20g -Xms20g -Xmn256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:ReservedCodeCacheSize=256m"
HBASE_MANAGES_ZK=false

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
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
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://bigdata/hbase</value>
<description>The directory shared by RegionServers.
</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 这个开关是给 rootdir 为 file:// 的 standalone 模式用的(本地文件系统不支持 hflush/hsync),
关掉的是"WAL 能否保证落盘"这项能力校验。rootdir 已经在 HDFS 上时不需要关,
关了等于让 HBase 对"WAL 无法保证落盘"这个丢数据风险失明。分布式 + HDFS 保持默认 true。 -->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
<property>
<name>hbase.client.scanner.caching</name>
<value>100</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.3</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.lowerLimit</name>
<value>0.25</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.5</value>
</property>
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>Time difference of regionserver from master</description>
</property>

<property>
<name>hbase.client.scanner.timeout.period</name>
<value>300000</value>
<description>default is 60s</description>
</property>

<!-- 别配成 1800000(30 分钟):一是这个值受 ZK 服务端 maxSessionTimeout 封顶
(默认 20 × tickTime,通常 40s),客户端单方面写大了协商不下来,除非同步改 zoo.cfg;
二是 30 分钟意味着 RegionServer 宕机后要 30 分钟才被发现、才触发 region 重分配,
这期间它上面的 region 全部不可用。 -->
<property>
<name>zookeeper.session.timeout</name>
<value>90000</value>
<description>default is 90s</description>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>300000</value>
<description>default is 60s</description>
</property>
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>268435456</value>
<description>default is 128M</description>
</property>
<property>
<name>hbase.hregion.max.filesize</name>
<value>6442450944</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>100</value>
<description>default is 30</description>
</property>

<!-- 测试需要添加此项,不然报错ServerNotRunningYetException: Server is not running -->
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
</configuration>

regionservers

1
2
3
hadoop01
hadoop02
hadoop03

backup-masters

1
hadoop02

hdfs-site.xml : 做 软链接

1
ln -s /etc/hadoop/conf/hdfs-site.xml /etc/hbase/conf

这几组内存数字必须一起算

上面配置里散落着三组参数,它们不是各自独立的,改一个不看另外两个基本一定会出问题。

第一组:读缓存 + 写缓冲有硬上限。

1
2
hbase.regionserver.global.memstore.upperLimit   0.3    <!-- 写缓冲占堆比例 -->
hfile.block.cache.size 0.5 <!-- 读缓存占堆比例 -->

HBase 在启动时会校验这两者之和,超过 0.8 直接拒绝启动(报 Current heap configuration for MemStore and BlockCache exceeds the threshold required for successful cluster operation)。留出的 0.2 是给 RPC 队列、region 元数据、压缩缓冲这些用的。

这里 0.3 + 0.5 = 0.8,正好卡在边界上——能起来,但一点余量都没有了。想再加读缓存就必须同步减写缓冲。按负载定方向:读多写少往 block cache 倾斜(0.4 / 0.4 甚至 0.2 / 0.6),写多读少反过来。

(顺带一提,global.memstore.upperLimit / lowerLimit 这两个名字在较新版本里已经换成了 hbase.regionserver.global.memstore.size...size.lower.limit,语义不变。)

第二组:-Xmx20g-Xmn256m 是有问题的。

1
-Xmx20g -Xms20g -Xmn256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

20GB 的堆只给 256MB 新生代,比例是 1.25%。后果是新生代几秒钟就填满一次,Young GC 极其频繁;更糟的是对象来不及在新生代里死掉就被晋升到老年代,而写入路径产生的 memstore 数据本来大多是短命的。老年代被这样持续灌入,CMS 就会频繁触发并产生碎片,最终以一次几十秒的 Full GC(concurrent mode failure + 压缩)收场——而 RegionServer 停顿超过 zookeeper.session.timeout 就会被判死、region 全部重新分配。

大堆下的常规做法是新生代给 1~2GB 起步(HBase 官方文档给的经验是每 GB 堆约 128MB 新生代),或者干脆换 G1(-XX:+UseG1GC -XX:MaxGCPauseMillis=100)——G1 自己管分代比例、天然做压缩,20GB 这个量级它比 CMS 好带得多。另外堆超过 32GB 会失去压缩指针,20g 这个选择本身是合理的。

第三组:region 大小和 flush 大小决定 compaction 频率。

1
2
hbase.hregion.memstore.flush.size   268435456    <!-- 256M,默认 128M -->
hbase.hregion.max.filesize 6442450944 <!-- 6G,默认 10G -->

这两个数一起决定了后台有多忙:flush.size 越大,落盘的 HFile 越少越大、compaction 次数越少,但每个 region 占的堆越多——单机能承载的 region 数量随之下降(region 数 × 256MB 不能超过 memstore 那 0.3 的份额,这就把第一组和第三组绑在了一起)。max.filesize 越小,split 越频繁、单 region 越小越均匀,但 region 总数上涨又推高 master 和 meta 的压力。

所以顺序应该是:先按业务算出单机预期承载多少 region,用它反推 flush.size 和 memstore 比例配不配得上,最后才定 max.filesize。倒过来先挑数字,往往就是本节这种”每个值单独看都合理、合起来算不通”的状态。

Hbase 启动

  1. 启动 master (hadoop01,hadoop02)
1
2
3
$ /opt/bigdata/hbase/current/bin/hbase-daemon.sh  start master
$ jps
95824 HMaster
  1. 启动 HRegionServer 服务 (hadoop01,hadoop02,hadoop03)
1
2
$ /opt/bigdata/hbase/current/bin/hbase-daemon.sh  start regionserver
java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000002d0000000, 21206401024, 0) failed; error='Cannot allocate memory' (errno=12)

提示报错,将内存调小,只用来测试安装

修改 /etc/hbase/conf/hbase-env.sh

1
2
3
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xmx1g -XX:ReservedCodeCacheSize=256m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xmx2g -Xms2g -Xmn256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:ReservedCodeCacheSize=256m"
HBASE_MANAGES_ZK=false

重新启动

验证

hbase shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[hadoop@hadoop02 bin]$ hbase shell
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.4.12, r8382f55b15be6ae190f8d202a5e6a40af177ec76, Fri Apr 29 19:34:27 PDT 2022
Took 0.0010 seconds
hbase:001:0> create 'test','data'
Created table test
Took 0.8866 seconds
=> Hbase::Table - test
hbase:002:0> list
TABLE
test
1 row(s)
Took 0.0149 seconds
=> ["test"]
hbase:003:0>

网页验证

HBASE_master

HBASE_backup