我正在考虑在Cassandra中实现一个具有很长行(每行数十万到数百万列)的CF.
使用完全虚拟数据,我已将200万列插入一行(均匀间隔).如果我执行切片操作以获得20列,那么我注意到在行中进一步切片操作时性能会大幅下降.
对于大多数列,我似乎能够在10-40ms内提供切片结果,但是当你走到行的末尾时,性能会上升到墙,响应时间逐渐从1,800,000标记处的43ms增加到214ms分别为1,900,000和435ms,分别为1,999,900!(所有切片宽度相等).
我无法解释为什么当你到达行尾时会出现性能大幅下降的原因.有人可以就Cassandra在内部做些什么来做出这样的延迟提供一些指导吗?行缓存已关闭,几乎所有内容都是默认的Cassandra 1.0安装.
它应该能够支持每行多达20亿列,但是在这种增加速度下,性能将意味着在实际情况下它不能用于很长的行.
非常感谢.
警告,我正在同时对10个请求进行并行处理,这就是为什么它们比我预期的要慢一些,但它对所有请求都是一个公平的测试,即使只是串行完成它们也有这个奇怪的在1,800,000和1,900,000记录之间的退化.
我还注意到,当每行只有200,000个列时,只对单个项目执行反向切片时性能很差:query.setRange(end,start,false,1);
关于这方面的一个很好的资源是Aaron Morton关于Cassandra的Reversed Comparators的博客文章.来自文章:
回想一下我在Cassandra查询计划中的帖子,一旦行达到一定的大小,它们就会包含列的索引.并且只要需要使用索引的任何部分就必须读取整个索引,这是使用指定开始或反转的切片范围时的情况.因此,针对行运行的最快切片查询是仅通过指定列计数来检索行中的前X列的查询.
如果您主要是从行尾读取(例如,如果您按时间戳存储内容并且您通常希望查看最近的数据),则可以使用Reversed Comparator以降序排列列的列.这将为您提供更好(更一致)的查询性能.
如果您的读取模式更随机,那么您可能最好将数据划分为多行.
psanford 的评论让我找到了答案。事实证明,Cassandra <1.1.0(目前处于测试版)在 Memtables 中的长行(尚未刷新到磁盘)上的切片上性能较慢,但在使用相同数据刷新到磁盘的 SSTables 上性能更好。
请参阅http://mail-archives.apache.org/mod_mbox/cassandra-user/201201.mbox/%3CCAA_K6YvZ=vd=Bjk6BaEg41_r1gfjFaa63uNSXQKxgeB-oq2e5A@mail.gmail.com%3E和https://issues.apache.org/ jira/浏览/CASSANDRA-3545。
在我的示例中,前 180 万行已刷新到磁盘,因此该范围内的切片速度很快,但最后约 200,000 行尚未刷新到磁盘,仍在内存表中。由于 memtables 切片在长行上速度很慢,这就是为什么我在行末尾看到性能不佳的原因(我的数据是按列顺序插入的)。
这可以通过在 cassandra 节点上手动调用刷新来修复。1.1.0 已应用补丁来解决此问题,我可以确认这为我解决了问题。
我希望这可以帮助其他遇到同样问题的人。
| 归档时间: |
|
| 查看次数: |
4721 次 |
| 最近记录: |