当我为HBase表设计行键时,我有两个问题要问
(考虑我们只有两个地区)
详细说明问题,
如果我插入以axx
开头的行密钥,bxx
,...,zxx
,HBase Master会将范围设为a-m
到一个区域和n-z
到另一个地区?
在另一种情况下如果我只插入仅从axx
和bxx
开始的rowkeys,它是否将axx
分配给第一个区域并将bxx
分配给另一个
答案 0 :(得分:1)
在现有区域填满之前,HBase中不会发生拆分。因此,如果您设置具有2个区域服务器的HBase群集,则所有数据最初只会添加到一个区域。当该区域填满时,数据将根据整个区域中间的任何键分为两个区域。
对于您的问题[[[1, 95.21],[2, 43.8]],[[0, 95.21],[3, 10.4]],[[0, 43.8],[5, 67.1]]
,所有密钥最初都会添加到一个区域。假设密钥均匀分布,您应该会在第一次拆分后看到一个接近1.
而另一个接近a-m
的东西。
为了以图形方式显示,假设我们的两个区域每个只能存储四行。输入四个记录后,您将看到:
n-z
现在,如果我们要添加REGION 1 REGION 2
+-----+ +-----+
| axx | | |
| bxx | | |
| cxx | | |
| dxx | | |
+-----+ +-----+
,它就不适合区域1,因此在区域中间发生分裂:
axy
最后添加了我们的新记录:
REGION 1 REGION 2
+-----+ +-----+
| axx | | cxx |
| bxx | | dxx |
| | | |
| | | |
+-----+ +-----+
<强>预裂强>
如果您事先知道可能的密钥分发并希望避免昂贵的自动拆分,则可以在创建表时pre-split:
REGION 1 REGION 2
+-----+ +-----+
| axx | | cxx |
| axy | | dxx |
| bxx | | |
| | | |
+-----+ +-----+
这将创建四个区域,每个区域包含create 'animals', 'a', {SPLITS => ['e','m','r']}
,0-e
,e-m
,m-r
之间的数据。