HBase行密钥分割算法

HBase行密钥分割算法,hbase,Hbase,我试图在Hbase上存储每个电话号码的一些数据。 我将使用的行键是reverse(PhoneNumber),以便更好地分发,因为特定国家/地区的大多数号码都以相同的国家/地区代码开头,从而导致热点。 我将把这些数据从mysql移动到Hbase 我随机抽取了100万个电话号码,并对UniformSplit和HexStringSplit进行了200次拆分,这是Hbase中两种预定义的字符串算法 使用UniformSplit,只有8个区域获得数据。 使用HexStringSplit 81个区域获取数据

我试图在Hbase上存储每个电话号码的一些数据。 我将使用的行键是reverse(PhoneNumber),以便更好地分发,因为特定国家/地区的大多数号码都以相同的国家/地区代码开头,从而导致热点。 我将把这些数据从mysql移动到Hbase

我随机抽取了100万个电话号码,并对UniformSplit和HexStringSplit进行了200次拆分,这是Hbase中两种预定义的字符串算法

使用UniformSplit,只有8个区域获得数据。 使用HexStringSplit 81个区域获取数据


是否有其他拆分算法或任何其他策略可供使用。

如果要使用此算法中的一种,则可能需要使用其他行键设计。我可以为此建议遵循以下模式。使用md5或类似的电话号码散列,并使用前几个号码作为salt,在这种情况下,行键

salt+phoneNumber

在这种情况下,您将有一个更均匀的分布,您可以应用其中一个默认的分割算法

我大体上同意@alexander kuznetsov的观点,但仅使用md5或哈希并不能解决问题

我建议采用以下设计:

rowKey = (phoneNumber % number_of_regions) + phoneNumber
这里我假设电话号码是Long或Int。这将根据区域数分布行键。 此外,我通常在开始使用以下方法插入数据之前预拆分表:

我通常也会指定拆分策略:

 tableDescriptor.setRegionSplitPolicyClassName(ConstantSizeRegionSplitPolicy.class.getName())
 tableDescriptor.setRegionSplitPolicyClassName(ConstantSizeRegionSplitPolicy.class.getName())