【问题标题】:Hbase rowkey design for time range query用于时间范围查询的 Hbase rowkey 设计
【发布时间】:2015-08-03 08:56:53
【问题描述】:

我需要获取从开始日期到结束日期的产品页面视图。所以我这样设计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 并确保避免热点、冲突。

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

【问题讨论】:

    标签: hbase


    【解决方案1】:

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

    行键长度 - 对于每个单元格,存储行键详细信息、列族和限定符详细信息。因此,始终建议尽可能地保留它们,主要是因为相同的信息会大规模重复。

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

    【讨论】:

    • 看来我的设计是对的,但是rowkey长度是49个字符。没事吧?
    【解决方案2】:

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

    因此,如果您想要 0 到 4(总共 5 个拆分),那么您需要将密钥构建为

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

    例如产品 ID 1180560

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

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

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

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2021-08-17
      • 2015-06-06
      相关资源
      最近更新 更多