甚至在cassandra中划分非均匀的远程数据

时间:2011-03-16 17:34:53

标签: database database-design cassandra cassandra-0.7

我有一个相当棘手的人,忍受我,因为我尽量不在这里绊倒我的话。我正在做一些研究,我的小组正在转换到cassandra数据库。我们的研究之前使用过MySQL,但数据已经超过了数据库(内存中的1.95亿行@ 16G - 这是查询数据的唯一方法。)数据本身有点静态。它有很多,但任何新数据在这一点上都有点慢。

数据由一大堆分类器 - 得分对组成。我们为数据库制定查询,基本上说,“给我以下分类器的前500名”。然后数据库返回那么多分数。例如,如果我们要求2个分类器的前500个分数,我们返回1000行(每行包括分类器ID和分数 - 即[4,9100])。分数本身是不均匀的(分布倾向于聚集到值的一端 - 顺便说一下,从-10000到10000)

当我们过渡到cassandra时,有许多要求。首先,我们需要能够在每个分类器的基础上查询最高和最低N分数。通常情况下,我可以看到一个有序的分区器适合这个,但是就像我说的那样,分数往往会在极端情况下崩溃(这会给一个节点带来太大的负担)。所以我的第一个问题是,如何在能够查询顶部或底部N的同时均匀分布分类器/分数对。

有一个次要要求几乎搞砸了第一个要求。有时需要找到接近另一个分数的所有分数。因此,如果我看到分类器6得分为400,我可能会问,给我看500分最接近的分数(全部在分类器6中)。我对这一点感到非常难过。我读过cassandra支持二级索引(yay)但只支持哈希类型(boo - no range)。我们是否为此用例创建了一个单独的ColumnFamily?

最后,速度至关重要。数据正在交互式GUI应用程序中使用。理想情况下,查询只需几秒钟。如果数据全部卡在一个特定节点上,它将减慢速度。

我们尝试过各种聪明的技巧。我们最好的想法是将数据放入桶中,以便前500个进入桶1,接下来的500个进入桶2,依此类推。优势在于,要获得前500名,我们只需要使用存储桶1.此外,所有数据都应使用随机分区器均匀分布。然而,由于我们的查询大部分只对第1个桶感兴趣,因此它会给一个节点带来很多负担(请记住,如果涉及N个分类器,则实际上每桶有500 * N个分数)。这个方案的真正缺点是,当我们需要根据分数的接近度进行查询时,它会崩溃(我们必须在桶上进行某种奇怪的二分查找以找到我们的起始值)。

此时我们的想法很低落。我所看到的关于cassandra的一切让我想知道它是否适合这项任务。我们选择它主要是因为它的水平可伸缩性,这很重要(添加节点比分割RDBM容易得多)。所以我想我的总体问题是:你将如何处理这个问题?如果是cassandra,请解决上述任何问题。否则,任何洞察力或智慧都将受到赞赏。感谢。

1 个答案:

答案 0 :(得分:3)

为什么不将分类器存储为列族行密钥,将分数存储在列名中。由于列已排序,因此查询给定分类器的顶部/底部500列非常快。第二种类型的查询也是可能的,当您在 s 附近寻找分数时,您可以在 s 之前选择500列,在 s之后选择500列< / em>然后过滤 s 附近的500列。