我需要存储由userId标识的用户生成的事件。每个用户都属于一个由companyId标识的公司。我想出了HBase中表的设计,如下所示:
行键:
列系列:信息(封装事件属性集,如下所示)
列:, ....
我知道,此 key 设计将有助于稍后通过使用部分 key 扫描在companyId和/或userId上查询数据。话虽如此,我有一些问题和疑虑,并希望得到一些想法。
1-如果我们有一个读取用例,它可以读取给定时间范围内的所有数据,那么在当前设计下,我们将无法使用rowKey。相反,我们将必须在timestamp字段(作为attr列之一单独维护)上进行全扫描和过滤行,我在这里完全偏离基准了吗?
2-如何处理重复项?我知道HBase会在这种情况下创建该行的新版本,但它会允许以后根据1中提到的读取用例进行读取吗?我知道您可以在查询时控制版本,但这会是一个好的设计还是会错误地重载 native 功能?
3-这与区域服务器热点有关。我们没有整体式 key ,但是如果说某个特定的公司或用户非常活跃,我们仍然可以解决此问题。在这种情况下,基于服务器数量的哈希和存储桶将无法正常工作?也许我们是否在timestamp字段上进行哈希处理并将其附加到rowKey而不是原始值上?但是,问题在于,无法扫描 key 的时间戳部分。我们必须在一个列中有一个单独的列(attr)来捕获它。有什么建议么?
非常感谢您可以提供的任何输入(评论,链接,书籍,想法)。
最佳答案
1:阅读用例
这取决于您的用例:
2:重复
注意:Hbase默认情况下最多记录一个单元格的3个版本(也不要将这些版本的时间戳与行键上的时间戳混淆)。您可以增加此限制并从不同版本获取结果,但是不建议将此版本计数设置为高数值。
如果要覆盖以前保存的值,我建议不要依靠查找保存的先前版本(尽管有一些方法可以实现此目的)。如果必须能够保存/获取所有先前记录的数据,则可以使用新列来存储新值。
3:热点地区
根据我对您问题的理解,我可能将 ROWKEY 设计为 HASH(companyId-UserId)-companyId-UserId-Timestamp
关于duplicates - 有关重复项和区域服务器热点的HBase表 key 设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15351130/