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) 上有唯一键索引email
和 item_type
在 where
语句中是强制性的吗?你有像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 行键设计的主要内容,如果未能解决你的问题,请参考以下文章