我需要从开始日期到结束日期获取产品的页面视图。所以我设计了这样的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并仍然确保避免热点,碰撞。
这种情况有更好的设计吗?
答案 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);