Hbase-原理-region拆分
为什么要要拆分region
防止一个region server机器中存储的数据过多 引起并发热点的问题
会将一个大表分成不同的region交给不同的region server,形成了分布式数据库,减少了我们某一个机器的负载压力
拆分策略
- 默认的拆分策略(大小)
· 当region的大小达到一定大小的时候会被拆分
· 当hbase表在regionserver上的region,如果region的大小到达一个阈值,这个region将会分为两个。
· 计算公式为:
Min{
1^32128M 256M
2^32128M 2G
3^32128M 6.75G
10G 10G
(表在一个regionserver上region的数量的立方) *2(the region memstore flush size),
hbase.hregion.max.filesize(默认是10GB)
}
如果默认值情况下,一个表在一个regionserver上split的阈值是:
256MB(第一次split),2GB(第二次),6.75GB(第三次),10GB(第四次),10GB… 10GB- keyPrefixRegionSplitPolicy(自定义)
这种拆分是在原来的拆分基础上 ,增加了拆分点(splitPoint,拆分点就是Region被拆分时候的rowkey)的定义,保证有相同前缀的rowkey不会被拆分到不同的Region上
参数是 keyPrefixRegionSplitPolicy.prefix_length rowkey:前缀长度- DelimitedKeyPrefixRegionSplitPolicy
和上一种查分策略一致 , 上一种是按照key的固定长度拆分的 , 这种按照的是分割符
DelimitedKeyPrefixRegionSplitPolicy.delimiter参分割符- region预拆分
row设计的一个关键点是查询维度
(在建表的时候根据具体的查询业务 设计rowkey 预拆分)
在默认的拆分策略中 ,region的大小达到一定的阈值以后才会进行拆分,并且拆分的region在同一个regionserver中 ,只有达到负载均衡的时机时才会进行region重分配!并且开始如果有大量的数据进行插入操作,那么并发就会集中在单个RS中, 形成热点问题,所以如果有并发插入的时候尽量避免热点问题 ,应当预划分 Region的rowkeyRange范围 ,在建表的时候就指定预range范围 .
hbase> create ‘t1’, ‘f1’, SPLITS => [‘10’, ‘20’, ‘30’, ‘40’]- 手动强制拆分
没有预期到的查询热点数据 需要手动的拆分
如果随着数据在执行的过程中出现部分region的热点问题, 那么这个region的数据必然会很大,这个时候需要我们手动的强制拆分region .
建议
1 预拆分初始化的数据
2 后续采取自动拆让Hbase来管理region的拆分
Hbase 表的手动强制拆分 (shell)
- 未拆分前表的样子
list_regions 'tb_stu'
- 拆分后
split 'a338a854bfcdd315f4e28c0cb0ac0d11', 'rk001'
- 在HDFS中查看
拆分完,原来的region Name 会保留一段时间,一段时间后原来的region Name会被删除,只保留拆分后的region Name
移动拆分后的一个region
- 将region Name为aaa7d4f6003b2f6fc5ca88e78daf2ff5的region移动到linux03机器中去
move 'aaa7d4f6003b2f6fc5ca88e78daf2ff5','linux03,16020,1606458591086'
注意:手动拆分的过程中HDFS会生成新的region文件夹,文件夹中会有hfile文件;所以拆分的过程中会消耗大量的资源