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

Hbase 如何在此场景中设置行键或分区策略以防止区域热点?,hbase,schema,region,Hbase,Schema,Region,我正在为我正在进行的项目评估一组数据存储,其中一个选项是在HBase中存储信息。我知道还有其他选择,但我想尝试一下在HBase中为这个用例设计一个模式 我有一组对象,每个对象都有一个objectId(单调递增),每个对象都有一组自定义属性(每个属性都有一个字符串name作为其id) 此外,我还有一些适用于所有对象的属性(即不绑定到任何特定的objectId) 每个属性都可以是一个简单值或一组值。例如,它可能类似于一个年龄(因此该值为int),也可能是CIDR格式的IP列表 每个属性都有以下信息:

我正在为我正在进行的项目评估一组数据存储,其中一个选项是在HBase中存储信息。我知道还有其他选择,但我想尝试一下在HBase中为这个用例设计一个模式

我有一组对象,每个对象都有一个
objectId
(单调递增),每个对象都有一组自定义属性(每个属性都有一个字符串
name
作为其id)

此外,我还有一些适用于所有对象的属性(即不绑定到任何特定的
objectId

每个属性都可以是一个简单值或一组值。例如,它可能类似于一个年龄(因此该值为
int
),也可能是CIDR格式的IP列表

每个属性都有以下信息:
name
objectId
(如果是针对所有对象,则为NULL/NA)、
value
和一些元数据(例如,谁进行了更改等)

我的访问模式如下:

  • 通过
    objectId
  • 使用新的
    名称和
    对象ID更新/放置新属性
  • 获取具有null
    objectId
    name
  • 使用新的
    名称
    更新/放置一个新属性,并且没有
    对象ID
我最初的想法是将它分成两个表(在同一个HBase仲裁中)。其中一个将具有绑定到
objectId
的所有属性,另一个将具有适用于所有对象的任何属性

行键的外观如下所示:

用于特定对象的属性

4字节sha1的
objectId
:二进制|
objectId
:长

将有一个CF具有所有属性(基本上是JSON kvp)

用于所有对象的属性

4字节sha1的
名称
:二进制|
名称
:字符串

将有一个CF具有所有属性(基本上是JSON kvp)

区域将在行键的第一个字节(因此实际上是sha的顶部字节)上进行预分割和分区

我确实有一个优化属性列表(例如CIDR格式的IP列表)。在这种情况下,我们将把值存储在键本身中:

4字节sha1的
名称
:二进制|
名称
:字符串|值:字符串

例如:

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)中键入,如果我只有不填充该范围的名称,则它将显示热点

我曾考虑过反转行键,但这只有在我将值存储在行键中时才起作用,这使得其中一种访问模式(在一次扫描中读取特定属性的所有值)不可能实现

问题

是否有其他方法来布置我缺少的行键,以防止区域热点

是否有一种不同的分区策略可以让我保留当前的行键,但避免热点

将两个表合并为一个表是否也有缺点