2011-03-16 30 views
3

我有一个相当棘手的问题,请耐心等待,因为我尽量不要在这里绊倒我的话。我正在做一些研究,我的小组正在过渡到cassandra数据库。我们的研究之前使用过MySQL,但数据超过了数据库(16G内存中的192万行 - 这是查询数据足够快的唯一方法)。数据本身就是静态的。这里有很多,但是在这一点上,任何新的数据都有点缓慢。即使在cassandra中划分不均匀的远程数据

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

当我们过渡到cassandra时,有一些要求。首先,我们需要能够在每个分类器的基础上查询最高和最低的N分数。通常情况下,我可以看到一个有序的分区器会适合这种情况,但正如我所说的那样,分数趋向于在极端情况下聚集(这会给一个节点带来太多的负担)。所以我的第一个问题是,我如何平均分配分类器/得分对,同时仍然能够查询顶部或底部N.

有一个第二个要求,几乎是第一个要求。有时候有必要找到附近的所有得分另一个得分。所以如果我看到分数为6的分数为6,我可能会问,向我展示500分最接近那个分数(全部在分类器6内)。我完全被这个问题困住了。我读过cassandra支持二级索引(耶),但只有散列类型(嘘 - 没有范围)。我们是否为这个用例创建了一个独立的ColumnFamily?

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

我们尝试了各种巧妙的技巧。我们最好的想法是将数据放入桶中,以便前500名进入第1桶,下一个500进入第2桶,等等。优点是获得我们刚刚要求的第一个500的顶部500.同样,所有数据都将使用随机分区器均匀分布。然而,由于我们的查询MOST只对第1桶感兴趣,它会给一个节点带来很大负担(请记住,如果涉及N个分类器,实际上它是每个桶500 * N个分数)。这个方案的真正缺点是,当我们需要根据分数的近似值进行查询时(我们必须对桶进行某种奇怪的二进制搜索以找到我们的起始值),它才会崩溃。

在这一点上,我们的想法很少。我见过的关于卡桑德拉的一切都让我怀疑它是否适合这个任务。我们选择它主要是因为它的横向可伸缩性,这很重要(添加节点比分割RDBM要容易得多)。所以我想我的总体问题是:你会如何处理这个问题?如果cassandra,请解决任何上述问题。否则,任何洞察力或智慧将不胜感激。谢谢。

回答

3

为什么不将分类器存储为列族行键和列名中的分数。由于列是排序的,因此查询给定分类器的顶部/底部500列非常快。第二种类型的查询也有可能,当您正在寻找附近S上的分数例如你可以选择以前小号和500列500列之后小号然后筛选附近小号 500列。

+0

如果我错了,纠正我,但你是否建议将给定分类器的所有分数存储在一行下?我想(或许不正确)cassandra对它可以容纳的列数有限制。现在每个分类器将有大约200万分与它相关联。 200万的分数,每一个都代表自己的专栏,仍然会快速查找? – 2011-03-16 22:38:30

+2

从版本0.7开始,每行最多可以存储20亿列。我做了一些测试,阅读表现很好。那么它对我的需求很好,而且只有大约100000列。 – Jcs 2011-03-16 23:13:22

+0

嗯,我必须尝试一下!非常感谢你的洞察力,非常感谢。 – 2011-03-16 23:21:28