Hbase rowkey设计用于时间范围查询

时间:2015-08-03 08:56:53

标签: hbase

我需要从开始日期到结束日期获取产品的页面视图。所以我设计了这样的Hbase rowkey。

ProductId(md5)_productId_dateKey(yyyymmdd)  d:pageview.

示例:productId是1180560. 8月1日到8月30日的rowkey将是:

0f0e02e9e24c29ad2c2b28e37e4f250b_1180560_20150801

.....

0f0e02e9e24c29ad2c2b28e37e4f250b_1180560_20150830

因此,我可以通过扫描带有开始行的rowkey,停止行

轻松获得时间范围的产品页面浏览量

我的问题是:

此设计是否避免热点?

rowkey的长度似乎太长了。它会影响性能吗?

有没有办法缩短rowkey并仍然确保避免热点,碰撞。

这种情况有更好的设计吗?

2 个答案:

答案 0 :(得分:1)

Hotspotting:即使您获得更好的扫描结果,也始终建议不要使用顺序行键。更多信息here

行键长度 - 对于每个单元格,存储rowkey详细信息,列族和限定符详细信息。所以始终建议尽可能保持拍摄,主要是因为大规模重复相同的信息。

接下来是什么 - 盐的使用及其前缀将有助于在区域服务器之间分配行。 This可以帮助您

答案 1 :(得分:0)

您不需要md5您的productId。只需根据您想要的区域服务器计算余数。即分裂。

所以,如果你想要0到4(总共5个分割),那么你需要建立你的密钥

Bytes(StringValue(productID%5)) + Bytes(productId) + Bytes(timestamp) 

例如,对于产品ID 1180560

1180560%5=0
Bytes.toBytes(1180560)
Bytes.toBytes(timestamp)

现在,您可以使用前缀扫描查询数据。

Java中的示例代码,用于获取同一产品的5天数据:

final Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -2); // deduct 2 days
byte[] STARTROW = Bytes.add(Bytes.toBytes( productID%5),Bytes.toBytes(productID),Bytes.toBytes(cal.getTime().getTime()));
cal.add(Calendar.DATE, +3); //add 3 days
byte[] ENDTROW = Bytes.add(Bytes.toBytes( productID%5),Bytes.toBytes(productID),Bytes.toBytes(cal.getTime().getTime()));
byte[] prefix = Bytes.add(Bytes.toBytes(String.valueOf(remainder)), 
Scan scan = new Scan(STARTROW,ENDTROW);
scan.setFilter(prefixFilter);