HBase行密钥拆分算法

时间:2017-07-21 12:01:15

标签: hbase

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

我随机抽取了100万个电话号码,并采用了200个UniformSplit和HexStringSplit分组--Hbase中的两个预定义字符串算法。

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

我可以使用任何其他分割算法或任何其他策略。

2 个答案:

答案 0 :(得分:0)

如果你使用这个算法之一,你应该使用另一个行键设计。我可以为此建议以下架构。使用md5或一些类似的电话号码哈希并使用前几个数字作为盐,在这种情况下,行键将是

salt+phoneNumber

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

答案 1 :(得分:0)

我一般会同意@ alexander-kuznetsov,但只使用md5或hash就不会解决问题。

我建议遵循以下设计:

rowKey = (phoneNumber % number_of_regions) + phoneNumber

这里我假设电话号码是Long或Int。这将根据区域的数量分配行键。 此外,我通常在开始使用HBase Amin API中的以下方法插入数据之前预先拆分表:

void createTable(TableDescriptor desc,
             byte[] startKey,
             byte[] endKey,
             int numRegions)
      throws IOException

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

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