【HBase】预分表和region合并

382 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

一、为何要预分区?

当一个 table 刚被创建的时候, Hbase 默认的分配一个 regiontable

也就是说这个时候, 所有的读写请求都会访问到同一个 regionServer 的同一个 region 中, 这个时候就达不到负载均衡的效果了, 集群中的其他 regionServer 就可能会处于比较空闲的状态。

解决这个问题可以用 pre-splitting, 在创建 table 的时候就配置好, 生成多个 region

  • 增加数据读写效率
  • 负载均衡, 防止数据倾斜
  • 方便集群容灾调度 region
  • 每一个 region 维护着 startRowendRowKey , 如果加入的数据符合某个 region 维护的 rowKey 范围, 则该数据交给这个 region

二、手动指定预分区

  1. 直接创建
$ 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 个:

访问 http://172.16.64.121:16010/table.jsp?name=person 2020-08-2914:55.png

  1. 文件创建

也可以把分区规则创建于文件中

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 个:

http://172.16.64.121:16010/table.jsp?name=student 2020-08-2914:59.png

2020-08-2914:59_1.png

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 的传参是 Regionhash 值, 而 Regionhash 值就是 Region 名称的最后那段在两个.之间的字符串部分。

需求: 需要把 student 表中的2个 region 数据进行合并:

student,,1587392159085.9ca8689901008946793b8d5fa5898e06. \
student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
# 进入 hbase shell

merge_region 'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'