我正在尝试为Hbase上的每个电话号码存储一些数据。 我将使用的行密钥是反向(PhoneNumber)以便更好地分发,因为特定国家/地区的大多数数字将以相同的国家/地区代码开头,从而导致热点。 我将把这些数据从mysql移动到Hbase。
我随机抽取了100万个电话号码,并采用了200个UniformSplit和HexStringSplit分组--Hbase中的两个预定义字符串算法。
使用UniformSplit,只有8个区域获取数据。 使用HexStringSplit 81区域获取数据。
我可以使用任何其他分割算法或任何其他策略。
答案 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())