我需要存储由userId标识的用户生成的事件。每个用户都属于一个由companyId标识的公司。我想出了HBase中表的设计,如下所示:

行键:

列系列:信息(封装事件属性集,如下所示)

:, ....

我知道,此 key 设计将有助于稍后通过使用部分 key 扫描在companyId和/或userId上查询数据。话虽如此,我有一些问题和疑虑,并希望得到一些想法。

1-如果我们有一个读取用例,它可以读取给定时间范围内的所有数据,那么在当前设计下,我们将无法使用rowKey。相反,我们将必须在timestamp字段(作为attr列之一单独维护)上进行全扫描和过滤行,我在这里完全偏离基准了吗?

2-如何处理重复项?我知道HBase会在这种情况下创建该行的新版本,但它会允许以后根据1中提到的读取用例进行读取吗?我知道您可以在查询时控制版本,但这会是一个好的设计还是会错误地重载 native 功能?

3-这与区域服务器热点有关。我们没有整体式 key ,但是如果说某个特定的公司或用户非常活跃,我们仍然可以解决此问题。在这种情况下,基于服务器数量的哈希和存储桶将无法正常工作?也许我们是否在timestamp字段上进行哈希处理并将其附加到rowKey而不是原始值上?但是,问题在于,无法扫描 key 的时间戳部分。我们必须在一个列中有一个单独的列(attr)来捕获它。有什么建议么?

非常感谢您可以提供的任何输入(评论,链接,书籍,想法)。

最佳答案

1:阅读用例

这取决于您的用例:

  • 如果您希望在给定的时间范围内获取组织的每个用户数据,那么您认为对我来说是正确的,并且您必须对所有组织数据进行扫描。
  • 如果您希望读取给定给定条件下的所有数据,则当前的键设计看起来不错。尽管我会翻转组织和用户ID的位置以创建新 key ( rowkey :userId-companyId-timestamp)。因为来自独立用户的数据是不相交的,所以现在不需要将它们耦合在一起。
  • 如果将时间戳记推到顶部( rowkey :timestamp-companyId-userId),则可以对所有组织/所有用户信息进行扫描,这些信息以时间范围定义的位置结尾(跳过整个表)扫描)

  • 2:重复

    注意:Hbase默认情况下最多记录一个单元格的3个版本(也不要将这些版本的时间戳与行键上的时间戳混淆)。您可以增加此限制并从不同版本获取结果,但是不建议将此版本计数设置为高数值。

    如果要覆盖以前保存的值,我建议不要依靠查找保存的先前版本(尽管有一些方法可以实现此目的)。如果必须能够保存/获取所有先前记录的数据,则可以使用新列来存储新值。

    3:热点地区
  • 如果公司非常活跃,则可以将companyId-userId的哈希附加到行键中。这将在任何组织上分发写内容。
  • 如果用户非常活跃,并且存在用例以最佳方式获取其所有数据的用例,那么我不确定对键或时间戳进行散列是否是一个好的解决方案。您肯定希望将用户的数据保持在一起,但我不确定这里会有更好的解决方案。

  • 根据我对您问题的理解,我可能将 ROWKEY 设计为 HASH(companyId-UserId)-companyId-UserId-Timestamp

    关于duplicates - 有关重复项和区域服务器热点的HBase表 key 设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15351130/

    10-16 20:17