HBase split问题

想请教一下,HBase 在split之前是不是必须得对该Region进行major compaction?
如果不必须的话,经过一些minor compaction,一个StoreFile的大小达到了split的标准,针对这个StoreFile进行split,但是同一Store下别的StoreFile中可能会与进行split的StoreFile有相同的rowkey或者范围交叉的rowkey,分成两个Region之后不同Region的rowkey就会存在交叉的情况。
所以在一个Region split之前必须得先major compaction,想请教一下是不是真的是这样?谢谢~
已邀请:

hmaster

赞同来自: Figo libis

split 前,不是必须执行major_compact的。
 
 
region 的 split 重点在于如何选取 spitkey,理想情况找到 region下数据的中间点作为 splitkey,一分为2。
但这样的话,就要求读取所有数据找到splitkey。通常这样性能很差。
 
HBase 目前处理逻辑是,找到该 Region下面最大 Store(列簇),从该列簇下找到最大的HFile。
选取该 HFile 的 midkey 作为 splitkey 。HFile 的 midkey 是生成 HFile 的时候就产生了,所以获取很快。
 
split 前如果有条件的话,对 hbase 的 表/region 执行 major_compact 后,
由于Store 下面的HFile都会被合并为一个 HFile,所以 splitkey 的选取会更加准确。
 
 
一个例子:
Store 有 8 个 hfile ,假如hfile 数据是连续的,每条数据大小一样长的话,hfile 如下。
[0,39] ,[40,59] ,[60,79],[80,99],[100,119],[120,139],[140,159],[160,189]
[0,39] 这个hfile 含有40条数据,是最大的,中间的点为20,则根据切片算法,会选择 20 作为 region 的切片点进行 split。
则region的范围就变成了(0,20),(20,189)
而最佳的 split 点应该是 90 附近的点。
如果执行 major_compact 后,则8 个 hfile 会合并为一个[0,189],中间点即为90,这样 split 的点就更加合适了。
 
另外Region Split的策略是可以配置的,也可以自己实现。可参加:

RegionSplitPolicy.getSplitPoint()
HStore.getSplitPoint()
这两块代码
 
 

hmaster

赞同来自: Figo libis

补充一下:
region split 只是引用操作,不会真的涉及到HFile的切分。
如REGION A split 为A-1,A-2
则会A-1,A-2会生成一些引用文件,去指向A的HFILE,将A-1,A2上线,A下降。
读取的时候,会通过引用文件去读取原来的HFile。
 
等下次对A-1,A-2执行major_compaction时,A-1,A-2 会读取A中的的HFile数据,生成到A-1,A-2对应的hfile中。

要回复问题请先登录注册