如何在此场景中设置行键或分区策略以防止区域热点?

disbfnqx  于 2021-06-09  发布在  Hbase
关注(0)|答案(0)|浏览(215)

我正在为我正在处理的项目评估一组数据存储,其中一个选项是在hbase中存储信息。我知道还有其他选择,但我想为这个用例在hbase中设计一个模式。
我有一组对象,每个对象都有一个 objectId (单调递增)并且每个对象都有一组自定义属性(每个属性都有一个字符串) name 作为其id)。
此外,我还有一些适用于所有对象的属性(即不绑定到任何特定对象) objectId ).
每个属性可以是一个简单的值,也可以是一个值列表。例如,它可以是一个年龄(因此值是一个 int )也可以是cidr格式的IP列表。
每个属性都有以下信息: name , objectId (如果是针对所有对象,则为null/na), value 以及一些元数据(例如,谁做了更改等)。
我的访问模式如下:
获取所有属性 objectId 使用新属性更新/放置新属性 name 以及 objectId 获取具有null的属性 objectId 以及 name 使用新属性更新/放置新属性 name 而且没有 objectId 我最初的想法是将它分成两个表(在同一个hbase仲裁中)。一个人将拥有与一个 objectId 另一个是适用于所有对象的任何属性。
行键如下所示:
对于特定对象的特性
4字节,共1字节 objectId :二进制| objectId :长
将有一个cf具有所有属性(基本上是json kvp)
适用于所有对象的特性
4字节,共1字节 name :二进制| name :字符串
将有一个cf具有所有属性(基本上是json kvp)
区域将在行键的第一个字节(因此实际上是sha的第一个字节)上进行预分割和分区。
我有一个优化的属性是事物的列表(例如cidr格式的IP列表)。在这种情况下,我们将值存储在键本身中:
4字节,共1字节 name :二进制| name :string |值:string
例如:

0x4eb9cce1|cidr|172.16.254.0/24
0x4eb9cce1|cidr|172.16.254.12/32
0x4eb9cce1|cidr|172.16.254.2/31
0xae999552|name|joe
0xae999552|name|matt

关注
我最关心的是区域热点问题。我的主意是把 objectId 是为了避免这样。我认为这个策略对对象的属性有效。
但问题是与任何特定对象都没有关联的属性。因为散列是在名称上,而不是在某个增加的id上,所以它将继续在某个特定区域中成为热点(假设我们对CIDR有几千次读取,而对名称有几百次读取,则为0x4eb9cce1和0xae999552提供服务的区域将获得所有通信量,而在任何其他区域中都没有)。即使区域被预先划分为三个区域,这些区域的键从键的第一个字节开始(始终是a-z),如果我只有不填充范围的名称,那么它将显示热点。
我考虑过反转row键,但是只有当我将值存储在row键中并且它使得其中一种访问模式(在一次扫描中读取特定属性的所有值)不可能时,这才有效。
问题
是否有其他方法来布局我缺少的行键,以防止区域热点?
有没有一种不同的分区策略可以让我保留当前的行键,但避免热插拔?
将两个表合并为一个表还有什么缺点吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题