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