我有一个相当棘手的问题,请容忍我,因为我尽量不要在这里为我的话绊脚石。我正在做一些研究,我的小组正在向卡桑德拉数据库过渡。我们的研究以前使用过MySQL,但是数据的增长超过了数据库(内存@ 16G中有1.92亿行--这是查询数据足够快的唯一方法)。数据本身是有点静态的。它有很多,但任何新的数据在这一点上都是缓慢的。
数据由一船分类器-分数对组成.我们对数据库提出查询,基本上是“给我以下分类器的前500位”。然后数据库返回那么多分数。例如,如果我们要求两个分类器的前500个分数,我们会得到1000行(每行包含一个分类器ID和一个分数--即49100)。分数本身是不一致的(分布倾向于向数值的一端-顺便说一句,从-10000到10000不等)。
在我们过渡到卡桑德拉时,有一些要求。首先,我们需要能够在每个分类器的基础上查询上、下N个分数。正常情况下,我可以看到有序的分区器对此是合适的,但是就像我说的那样,分数往往会在极值处聚集(这会给一个节点带来太多的负担)。因此,我的第一个问题是,如何均匀地分配分类器/分数对,同时仍然能够查询顶部或底部N。
还有一个次要的要求,它几乎把第一个要求搞砸了。有时,有必要找到接近另一个分数的所有分数。所以,如果我看到分类器6的分数为400,我可能会问,给我看500个与它最接近的分数(都在分类器6内)。我对这件事很困惑。我读过cassandra支持二级索引(yay),但只支持散列类型(boo )。我们是否为这个用例创建了一个独立的ColumnFamily?
最后,速度是最重要的。数据正在交互式GUI应用程序中使用。理想情况下,查询只需几秒钟。如果数据都卡在一个特定的节点上,它会减慢速度。
我们试过各种聪明的伎俩。我们最好的想法是将数据放入桶中,使前500位进入第1桶,接下来的500位进入第2桶,以此类推。优点是,为了获得前500名,我们只需要一桶1,而且所有的数据都会使用随机分区器均匀分布。但是,由于我们的大多数查询只对第1桶感兴趣,它只会给一个节点带来很大负担(请记住,如果涉及N个分类器,实际上每个桶的分数是500 *N)。这种方案的真正缺点是,当我们需要根据接近某个分数进行查询时,它就会分崩离析(我们必须对桶进行某种奇怪的二进制搜索,以找到我们的起始值)。
在这一点上,我们的想法越来越少。我所看到的关于卡桑德拉的一切让我怀疑它是否适合这个任务。我们之所以选择它,主要是因为它具有水平可伸缩性,这一点很重要(添加节点要比分割RDBM容易得多)。所以我想我的总体问题是:你将如何处理这个问题?如果卡桑德拉,请解决上述任何问题。否则,任何洞察力或智慧都将受到赞赏。谢谢。
发布于 2011-03-16 22:19:40
为什么不将分类器存储为列族行键和列名中的得分。由于列是排序的,所以查询给定分类器的顶部/底部500列是非常快的。第二种类型的查询也是可能的,当您查找s附近的分数时,可以在s之前选择500列,在s之后选择500列,然后过滤s附近的500列。
https://stackoverflow.com/questions/5329328
复制相似问题