3

有 GAE 大表的背景。根据我的阅读,HBase 是 Big Table 的开源版本,在功能上应该非常相似。

使用 Big Table,可以在 Olog(n) 时间内对该对象进行索引和查询:

目的

widget{
     names:     ['spike', 'cheeta', 'badger']
     counts:    [4, 6, 7]
     size:      387331209
}

询问

SELECT * FROM widget_table WHERE names == 'spike' AND counts = 6 ORDER BY size

几个小时以来一直在研究 HBase 文档,但似乎仍然无法找到这个问题的明确答案:

问题:

我可以使用 HBase 在大约 Olog(n) 时间内执行一个不相等运算符和两个或多个相等运算符的搜索吗?

这在 GAE 的大表中是可能的,如下所示:https ://developers.google.com/appengine/docs/python/datastore/queries#Restrictions_on_Queries

非常感谢!

4

2 回答 2

1

克里斯,也许这至少会以某种方式帮助你。在 HBase 中,一切都取决于您的行键设计(特别寻找 openTSDB 案例)。例如,在您的情况下,键可能如下所示:

[name-code] [counts-code] [...]

在这种情况下,您可以轻松地为具有特定名称/计数且具有 Olog(n) 复杂性的所有记录选择范围。如果 key 不包括根据大小计算的组件,则搜索特定大小的复杂度为 O(n)。如果键包含大小(或至少一些基于大小的计算),这将加快过程,因为它允许您将范围限制为 Olog(n)。

HBase 是一个非常简单的工具,可让您执行神奇的事情,但前提是您真的知道它是如何工作的,是的,它类似于具有最少抽象的“原始引擎”。

另请注意,如果每个names/counts字段值有很多记录,您可能需要在集群节点之间平衡此类请求加载。所以这会影响您的表/行键设计。例如,我现在设计了具有完美负载平衡的表的线性全扫描优于没有平衡的有限扫描。

于 2013-05-19T11:32:25.130 回答
1

同意罗曼;

HBase

  • 是分布式键/值存储

  • 没有内置的索引结构(除了这里描述的第三方工具)

  • 没有内置的查询语言支持(使用 Hive 可能会轻松,但她会禁止您使用没有第三方库支持的编程语言存储在 HBase 中的数据。或者您可以使用HCatalog代替 Hive、Pig gang。但这会使它成为一个普通的 RDBMS,每一行都有寻找延迟,就像 RDBMS 平台使用 BTree 一样的结构所做的那样)

  • 根据行键(唯一可用的内置索引)进行批量读取非常好;如果你设计好你的rowkey,你只会非常快地首先寻找startrowkey并从那里批量读取磁盘转换率到stoprowkey。

如果您可以以这种方式设计数据,它将非常适合。

除此之外,当然你可以过滤你的数据,无论这个过滤器是在 rowkey 上还是在有效负载上,但是如果没有 startrowkey 或 stoprowkey,查询(或使用 map/reduce 作业)将不得不读取即使您将过滤器放在有效负载或行键上。

因此,您在进行评估时必须考虑这些。

PS:因为rowkey的设计,startrowkey和stoprowkey是至关重要的。您可以创建一个复合行键,但字段的顺序非常重要。

于 2013-05-19T15:17:19.647 回答