duplicates - 关于重复和区域服务器热点的 HBase 表键设计

标签 duplicates hbase primary-key-design

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

行键 :

列族 : info(封装一组事件属性,如下所示)

栏目 : <属性1>, <属性2>....<属性>

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

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

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

3- 这与区域服务器热点有关。我们没有单片 key ,但如果某个特定的公司或用户非常活跃,我们仍然会遇到这个问题。在这种情况下,基于服务器数量的散列和分桶将不起作用?也许如果我们对时间戳字段进行散列并将其附加到 rowKey 而不是原始值?但问题是无法扫描 key 的时间戳组件。我们必须在一列中有一个单独的列 (attr) 来捕获它。有什么建议?

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

最佳答案

1:阅读用例

这取决于您的用例:

  • 如果您希望在给定的时间范围内获取组织的每个用户数据,那么您所拥有的对我来说似乎是正确的,并且您必须对所有组织数据进行扫描。
  • 如果您希望读取给定当前 key 设计的所有数据似乎没问题。尽管我会翻转组织和用户 ID 位置来制作新键( rowkey : userId-companyId-timestamp)。由于来自独立用户的数据是不相交的,因此现在不需要将它们耦合在一起。
  • 如果您将时间戳推到顶部( rowkey : timestamp-companyId-userId),您可能能够对所有组织/所有用户信息进行扫描,这些信息以时间范围定义的位置结束(跳过全表扫描)

  • 2:重复

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

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

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

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

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

    相关文章:

    python - 如何将已删除的 python pandas 列保存为 csv?

    firebase - 为什么在 Kotlin 中迭代 firebase 数据库时元素值添加了两次?

    c++ - 在 C++ 中使用 Hbase Thrift2 API

    java - 具有独立 hbase 的 spring hbase 示例

    sql - 为什么一个SQL表有多个主键?

    mysql - 没有两行不同的表具有相同的主键?

    MySQL 使用子查询的结果

    java - 在 Java 内存游戏中,如何触发已发现的 2 个未知数,并让它们在游戏的其余部分保持显露出来?

    hadoop - 如何使用 MAP-REDUCE java 程序将 HBASE 表加载到 HDFS

    mysql - 为什么不允许在一个表中使用两个主键?