Region分区
Region切分分为两种,创建表格时候的预分区即自定义分区,同时系统默认还会启动一个切分规则,避免单个 Region 中的数据量太大。
1. 预分区(自定义分区)
1.1 生成16进制序列预分区
hbase:014:0> create 'bigdata:staff1','info',SPLITS => ['1000','2000','3000','4000']
2025-02-28 13:02:59,614 INFO [main] client.HBaseAdmin (HBaseAdmin.java:postOperationResult(3751)) - Operation: CREATE, Table Name: bigdata:staff1, procId: 194 completed
Created table bigdata:staff1
Took 2.1810 seconds
=> Hbase::Table - bigdata:staff1
在Hbase页面查看新建的staff1表:
1.2 生成16进制序列预分区
hbase:007:0> create 'bigdata:staff2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
2025-02-28 13:49:05,859 INFO [main] client.HBaseAdmin (HBaseAdmin.java:postOperationResult(3751)) - Operation: CREATE, Table Name: bigdata:staff2, procId: 208 completed
Created table bigdata:staff2
Took 2.2060 seconds
=> Hbase::Table - bigdata:staff2
在Hbase页面查看新建的staff2表: 可以看到拆分区的是使用八位的十六进制数字进行区分。存放数据的时候首先将rowkey进行16进制转换,然后再放进对应范围分区里面,使用起来不太直观。
1.3 按照文件中设置的规则预分区
创建split.txt文件内容如下,文件不能有空行和空格:
[jack@hadoop102 hbase-2.6.1]$ cat split.txt
aaa
bbb
ccc
ddd
eee
hbase:010:0> create 'bigdata:staff4','info',SPLITS_FILE => 'split.txt'
2025-02-28 14:05:49,411 INFO [main] client.HBaseAdmin (HBaseAdmin.java:postOperationResult(3751)) - Operation: CREATE, Table Name: bigdata:staff4, procId: 254 completed
Created table bigdata:staff4
Took 2.1640 seconds
=> Hbase::Table - bigdata:staff4
1.4 使用JavaAPI创建预分区
2. 系统拆分
Region的拆分是由HRegionServer完成的,在操作之前需要通过ZK汇报master,修改对应的Meta表信息添加两列 info:splitA和info:splitB信息。之后需要操作HDFS上面对应的文件,按照拆分后的Region范围进行标记区分,实际操作为创建文件引用,不会挪动数据。刚完成拆分的时候,两个Region都由原先的RegionServer管理。之后汇报给 Master,由Master将修改后的信息写入到Meta表中。等待下一次触发负载均衡机制,才会修改Region的管理服务者,而数据要等到下一次压缩时,才会实际进行移动。
不管是否使用预分区,系统都会默认启动一套Region拆分规则。不同版本的拆分规则有差别。系统拆分策略的父类为 RegionSplitPolicy。
2.1 0.94版本之前
使用的策略是ConstantSizeRegionSplitPolicy类:当1个region中的某个Store下所有StoreFile 的总大小超过hbase.hregion.max.filesize
(10G),该Region就会进行拆分。
2.2 0.94版本之后,2.0版本之前
使用的策略是IncreasingToUpperBoundRegionSplitPolicy类:当1个region中的某个Store下所有StoreFile的总大小超过min(initialSize*R^3 ,hbase.hregion.max.filesize)
,该Region就会进行拆分。其中 initialSize的默认值为2*hbase.hregion.memstore.flush.size
,R为当前Region Server中属于该Table的Region个数(0.94版本之后)。具体的切分策略为:
第一次split:1^3256=256MB
第二次split:2^3256=2048MB
第三次split:3^3256=6912MB
第四次split:4^3256=16384MB>10GB,因此取较小的值10GB
后面每次split的size都是10GB了。
2.3 2.0版本之后
使用的策略是SteppingSplitPolicy类:如果当前RegionServer上该表只有一个 Region,按照2*hbase.hregion.memstore.flush.size
分裂,否则按照hbase.hregion.max.filesize
分裂。