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(因为有盐)也不能重建行键。
两者都需要。方法如下:
- 为了避免热点,在行键前添加
date
和 product_id
的散列(不是 UUID !)。一个简单的散列函数,如 murmur 应该可以。
- 由于
date
和 product_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 以面向对象的方式通过前缀获取记录(披露:我是图书馆的作者)。
我有大量数据要存入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(因为有盐)也不能重建行键。
两者都需要。方法如下:
- 为了避免热点,在行键前添加
date
和product_id
的散列(不是 UUID !)。一个简单的散列函数,如 murmur 应该可以。 - 由于
date
和product_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 以面向对象的方式通过前缀获取记录(披露:我是图书馆的作者)。