hbase 行键设计

Posted

技术标签:

【中文标题】hbase 行键设计【英文标题】:hbase rowkey design 【发布时间】:2013-03-02 18:42:03 【问题描述】:

由于数据增加,我正在从 mysql 迁移到 hbase。

我正在设计高效访问模式的行键。

我想实现 3 个目标。

    获取电子邮件地址的所有结果 获取email地址+item_type的所有结果 获取特定电子邮件地址 + item_id 的所有结果

我有 4 个属性可供选择

    用户邮箱 反向时间戳 item_type item_id

我的 rowkey 应该是什么样子才能有效地获取行?

谢谢

【问题讨论】:

您能否提供等效的 SQL 来实现您的目标? select * from table where email = "xyz" and item_type=2 order by ts desc...我在 (email, item_type , item_id) 上有唯一键索引 emailitem_typewhere 语句中是强制性的吗?你有像select * from table where email = "xyz" select * from table where item_type=2 这样的声明吗?你已经提到你想在你的帖子中“获取特定 item_id 的所有结果”。我没有从你的 SQL 中看到它。 对不起...电子邮件始终存在于任何查询中 【参考方案1】:

假设您的主要访问是通过电子邮件,您可以将主表键设置为 email + reverse time + item_id(假设 item_id 给你唯一性)

您可以有一个附加的“索引”表,其中 email+item_type+reverse time+item_id 和 email+item_id 作为映射到第一个表的键(因此通过这些检索是一个两步过程)

【讨论】:

好的,我可以将 item_type 保留为列限定符吗?列限定符是否在 hbase 中编入索引? 您可以将所有数据添加为列,但 HBase 并没有真正索引任何内容。它的作用是通过键按字典顺序存储数据,以便可以轻松找到它,但它不是数据库意义上的索引。【参考方案2】:

就连接的行键而言,也许您已经朝着正确的方向前进:无论如何,您的帖子都会想到以下内容:

分区键可能由您的反向时间戳加上最常查询的自然键组成 - 会是电子邮件吗?让我们假设:然后选择根据两者中的哪一个(反向时间戳与电子邮件)来提供最平衡/非偏斜的数据分布来制作前缀。这让您的区域服务器更快乐。

根据记录的更好平衡分布进行选择: 反向时间戳加上最常查询的自然键 例如反向时间戳电子邮件 或电子邮件反向时间戳

通过这种方式,您将避免区域服务器上的热点。 .

为了在附加的(二级)索引上获得良好的性能,这还没有“融入”hbase:他们有一个设计文档(在 wiki 中的 SecondaryIndexing 下查看)。

但您可以通过以下几种方式构建自己的:

a) 使用协处理器将 item_type 编写为 rowkey 以将 tabole 与包含原始 (user_email-reverse timestamp (或反之亦然) 事实表 rowke 的列分开

b) 如果磁盘空间没有问题和/或行很小,请继续并在第二个(对于 item-id 情况下为第三个)表中复制整行。

【讨论】:

以上是关于hbase 行键设计的主要内容,如果未能解决你的问题,请参考以下文章

HBase 行键设计

hbase 的最佳行键设计

HBase 模式行键设计 - 增量计数器?

hbase 利用rowkey设计进行多条件查询

Hbase 性能行键与列限定符

HBASE表设计