我需要存储由userId标识的用户生成的事件。每个用户都属于一个由companyId标识的公司。我在 HBase 中提出了一个表设计,如下所示:
行键:<公司ID ><用户ID ><时间戳>
column-family : info (封装事件属性集,如下所示)
列:< attr1 >、< attr2 >....< attrn >
我知道这种键设计将有助于稍后通过使用部分键扫描在companyId和/或userId上查询数据。话虽如此,我有一些问题和疑虑,想得到一些想法。
1-如果我们有一个读取给定时间范围的所有数据的读取用例,那么在当前的设计中,我们将无法使用 rowKey。相反,我们将不得不对时间戳字段进行全面扫描和过滤行(作为attr列之一单独维护)我在这里完全偏离基础吗?
2-如何处理重复?我知道 HBase 在这种情况下会创建该行的新版本,但它是否允许稍后根据 1 中提到的读取用例进行读取?我知道您可以在查询时控制版本,但这会是一个好的设计还是错误地重载本机功能?
3-这与区域服务器热点有关。我们没有单片密钥,但如果某个特定公司或用户非常活跃,我们仍然可以解决这个问题。基于服务器数量的散列和分桶在这种情况下不起作用?也许如果我们对时间戳字段进行散列并将其附加到 rowKey 而不是原始值?但是问题在于无法扫描密钥的时间戳组件。我们必须在一个列中有一个单独的列 (attr) 来捕获它。有什么建议么?
非常感谢您提供的任何输入(评论、链接、书籍、想法)。