2013-03-12 52 views
4

我有一个需求来存储由userId标识的用户生成的事件。每个用户属于由companyId标识的公司。我想出了在HBase的对表的设计如下:关于复制和区域服务器热点的HBase表关键设计

rowkey:< companyId> < 用户id> < 时间戳>

列家族:信息(封装一套事件属性如下所示)

:< attR1位>,< attR2位> .... < attrn>

我知道这个关键的设计将有助于通过使用部分密钥稍后上companyId和/或用户id查询数据扫描。话虽如此,我还是有一些疑问和担忧,并希望得到一些想法。

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

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

3-这是关于区域服务器热点。我们没有单一的密钥,但是如果说一个特定的公司或用户非常活跃,我们仍然可以解决这个问题。在这种情况下,基于服务器数量的散列和分组不会起作用吗?也许如果我们散列时间戳字段并将其附加到rowKey而不是原始值?但是接下来的问题是,在密钥的时间戳组件上扫描是不可能的。我们必须在列中有一个单独的列(attr)来捕获该列。有什么建议么?

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

回答

2

1:阅读使用情况

这取决于你的使用情况:

  • 如果你想在给定的时间范围内的每个用户的数据读取一个组织,那么你有什么似乎是正确的对我来说,你必须扫描所有的组织数据。

  • 如果你想读取给定的所有数据你目前的关键设计看起来不错。虽然我会翻转使用新密钥的组织和用户ID位置(rowkeyuserId-companyId-timestamp)。这将因为来自独立用户的数据不相交,所以现在不需要耦合在一起。

  • 如果您在顶部(rowkey时间戳companyId-用户id)推时间戳,您可以运行在所有单位的扫描/所有用户的信息在一个位置结束的时候定义范围(跳过一个全表扫描)

2:复制

当心:HBase的默认记录高达3版本的单元(你rowkey也不要混淆与时间戳这些版本的时间戳)的。您可以增加此限制并从不同版本获取结果,但不建议此版本计数为高数。

如果你要写上你先前保存的值,我建议不要依靠查找以前保存的版本(虽然有办法实现这一点)。如果您必须能够保存/获取所有以前记录的数据,则可以使用新列来存储新值。

3:热区

  • 如果一个公司是非常活跃的,你可以companyId-用户id的哈希值追加到rowkey。这将分配任何组织的写入。

  • 如果用户非常活跃并且有一个用例以最佳方式获取其所有数据,那么我不确定散列在关键字或时间戳上是一个很好的解决方案。你肯定会想要为用户保存数据,我不确定这里的更好的解决方案是什么。

此基础上我如何理解你的问题,我可能会设计ROWKEYHASH(companyId-用户ID)-companyId-用户ID时间戳