【问题标题】:HBase : how to design this rowkey?HBase:如何设计这个行键?
【发布时间】:2020-08-12 21:19:23
【问题描述】:

我有大量数据要存储到 HBase 中。它基本上是包含产品信息的 csv 文件:

date|product_id|client_id|client_name
2020-08-02|152341|1|Tom
2020-08-02|152341|2|Kate

用户应该能够通过(date, product_id)(应该是API 参数)检索产品信息列表。 (date, product_id) 不是唯一的。

这种情况下,HBase中的rowkey如何设计?

由于(date, product_id) 不是唯一的,我必须在向 HBase 插入数据时为其添加 UUID。所以它看起来像这样:2020-08-02_152341_[UUID]。它可以正常工作,但在这种情况下会出现热点问题。

但是如果我像01-2020-08-02_152341_[UUID] 这样添加盐/哈希,我怎么知道 UUID 是什么?它不是用户输入的一部分。所以我既不能使用 startKey/endKey(因为有盐)也不能重建 rowkey。

【问题讨论】:

    标签: hbase


    【解决方案1】:

    两者都需要。方法如下:

    • 为避免热点,在行键前添加 date 和 product_id 的哈希(不是 UUID!)。一个简单的散列函数,例如murmur 应该可以。
    • 由于date 和product_id 的组合不是唯一的,您还需要追加一个值到您的行键。这可以是 UUID。但是,如果可能,将其附加到域模型中现有属性的值如果唯一。 (我看到"1|Tom" 是一个记录。那"1" 是唯一的吗?)

    从 HBase 访问记录时,通过“前缀过滤器”读取行。在这种情况下,您的前缀将是:

    hash(date + "_" + product_id) + "_"+ date + "_" + product_id + "_"
    

    请参阅setRowPrefixFilter 了解如何按前缀获取。或者,您可以考虑使用诸如hbase-orm 之类的库以面向对象的方式通过前缀获取记录(披露:我是该库的作者)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多