Cassandra表现为长行

时间:2012-03-16 17:06:47

标签: cassandra

我正在考虑在Cassandra中实现一个CF,它有很长的行(每行数十万到数百万列)。

使用完全虚拟数据,我已将200万列插入单行(均匀间隔)。如果我执行切片操作以获得20列,那么我注意到在行中进一步切片操作时性能会大幅下降。

对于大多数列,我似乎能够在10-40ms内提供切片结果,但是当你走到行的末尾时,性能就会出现问题,响应时间从1,800,000处的43ms开始逐渐增加标记为214毫秒,1,900,000和435毫秒,1,999,900! (所有切片宽度相等)。

我无法解释为什么当你到达行尾时会出现性能大幅下降的原因。有人可以就Cassandra在内部做些什么来做出这样的延迟提供一些指导吗?行缓存已关闭,几乎所有内容都是默认的Cassandra 1.0安装。

它应该能够支持每行多达20亿个列,但是在这种增加速度下,性能将意味着它在实际情况下不能用于很长的行。

非常感谢。

警告,我同时并行处理了10个请求,这就是为什么它们比我预期的要慢一点,但这是对所有请求的公平测试,甚至只是在串行中完成它们这是1,800,000和1,900,000记录之间的奇怪退化。

我还注意到,当每行只有200,000个列时,对单个项目执行反向切片时性能会非常糟糕:   query.setRange(end,start,false,1);

2 个答案:

答案 0 :(得分:9)

关于这方面的一个很好的资源是Aaron Morton关于Cassandra Reversed Comparators的博客文章。来自文章:

  

回想一下Cassandra Query Plans上的帖子,一旦行达到一定的大小,它们就会包含列的索引。并且只要需要使用索引的任何部分就必须读取整个索引,这是使用指定开始或反转的切片范围时的情况。因此,针对行运行的最快切片查询是仅通过指定列数来检索行中的前X列的查询。

如果您主要是从行尾读取(例如,如果您按时间戳存储内容并且您最想查看最近的数据),则可以使用Reversed Comparator按降序存储列。这将为您提供更好(更一致)的查询性能。

如果您的阅读模式更随机,那么您可能最好将数据划分为多行。

答案 1 :(得分:4)

psanford的评论让我得到了答案。事实证明,Cassandra< 1.1.0(目前处于测试阶段)在Memtables中的长行(未刷新到磁盘)上的片上性能较慢,但在使用相同数据刷新到磁盘的SSTable上性能更好。

请参阅http://mail-archives.apache.org/mod_mbox/cassandra-user/201201.mbox/%3CCAA_K6YvZ=vd=Bjk6BaEg41_r1gfjFaa63uNSXQKxgeB-oq2e5A@mail.gmail.com%3Ehttps://issues.apache.org/jira/browse/CASSANDRA-3545

根据我的示例,前180万行已刷新到磁盘,因此超出该范围的切片速度很快,但最后约200,000行尚未刷新到磁盘并且仍在memtables中。由于memtables切片在长行上很慢,这就是为什么我在行的末尾看到了糟糕的性能(我的数据按列顺序插入)。

可以通过在cassandra节点上手动调用flush来解决此问题。修补程序已应用于1.1.0以解决此问题,我可以确认这可以解决这个问题。

我希望这可以帮助其他人解决同样的问题。