「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
一、为何要预分区?
当一个 table 刚被创建的时候, Hbase 默认的分配一个 region 给 table。
也就是说这个时候, 所有的读写请求都会访问到同一个 regionServer 的同一个 region 中, 这个时候就达不到负载均衡的效果了, 集群中的其他 regionServer 就可能会处于比较空闲的状态。
解决这个问题可以用 pre-splitting, 在创建 table 的时候就配置好, 生成多个 region。
- 增加数据读写效率
- 负载均衡, 防止数据倾斜
- 方便集群容灾调度
region - 每一个
region维护着startRow与endRowKey, 如果加入的数据符合某个region维护的rowKey范围, 则该数据交给这个region维
二、手动指定预分区
- 直接创建
$ create 'person','info1','info2',SPLITS => ['1000','2000','3000']
hbase(main):022:0> create 'person','info1','info2',SPLITS => ['1000','2000','3000']
0 row(s) in 2.3200 seconds
=> Hbase::Table - person
如图,region划分成 4 个:
- 文件创建
也可以把分区规则创建于文件中
vim split.txt
# 文件内容
aaa
bbb
ccc
ddd
# 然后执行
$ create 'student','info',SPLITS_FILE => '/root/hbase/split.txt'
hbase(main):023:0> create 'student','info',SPLITS_FILE => '/root/hbase/split.txt'
0 row(s) in 2.2870 seconds
=> Hbase::Table - student
如图,region 划分为 5 个:
Region的合并不是为了性能, 而是出于维护的目的。
四、如何进行 Region 合并
(1)通过 Merge 类冷合并 Region
需要先关闭
hbase集群
需求: 需要把 student 表中的2个 region 数据进行合并:
student,,1593244870695.10c2df60e567e73523a633f20866b4b5.
student,1000,1593244870695.0a4c3ff30a98f79ff6c1e4cc927b3d0d.
这里通过 org.apache.hadoop.hbase.util.Merge 类来实现, 不需要进入 hbase shell , 直接执行(需要先关闭 hbase 集群):
hbase org.apache.hadoop.hbase.util.Merge student \
student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59. \
student,aaa,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.
(2)通过 online_merge 热合并 Region
不需要关闭
hbase集群, 在线进行合并
与冷合并不同的是, online_merge 的传参是 Region 的 hash 值, 而 Region 的 hash 值就是 Region 名称的最后那段在两个.之间的字符串部分。
需求: 需要把 student 表中的2个 region 数据进行合并:
student,,1587392159085.9ca8689901008946793b8d5fa5898e06. \
student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
# 进入 hbase shell
merge_region 'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'