HBase:如何设计这个rowkey?

HBase : how to design this rowkey?

我有大量数据要存入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]。可以正常使用,但这种情况下会出现热点问题。

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

两者都需要。方法如下:

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

从 HBase 访问记录时,按 'prefix filter' 读取行。在这种情况下,您的前缀将是:

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

参见 setRowPrefixFilter for how to fetch by prefix. Alternatively, you may consider using a library such as hbase-orm 以面向对象的方式通过前缀获取记录(披露:我是图书馆的作者)。