【问题标题】:Cassandra performance for long rows长行的 Cassandra 性能
【发布时间】:2012-04-02 05:56:10
【问题描述】:

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

使用完全虚拟的数据,我在一行中插入了 200 万列(均匀分布)。如果我执行切片操作以获得 20 列,那么当您在行的下方执行切片操作时,我会注意到性能大幅下降。

对于大多数列,我似乎能够在 10-40 毫秒内提供切片结果,但是当您接近行尾时,性能会受到影响,响应时间从 1,800,000 的 43 毫秒逐渐增加在 1,900,000 处标记为 214 毫秒,在 1,999,900 处标记为 435 毫秒! (所有切片的宽度相等)。

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

它应该能够支持每行多达 20 亿列,但以这种速度提高的性能将意味着它在实际情况下不能用于非常长的行。

非常感谢。

警告,我一次并行处理 10 个请求,这就是为什么它们比我预期的要慢一些,但这是对所有请求的公平测试,甚至只是在那里串行执行它们这是第 1,800,000 和第 1,900,000 记录之间的奇怪降级吗?

我还注意到,当每行只有 200,000 列时,仅对单个项目进行反向切片时性能极差: query.setRange(end, start, false, 1);

【问题讨论】:

    标签: cassandra


    【解决方案1】:

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

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

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

    如果您的读取模式更加随机,您最好将数据划分为多行。

    【讨论】:

    • 感谢普桑福德的回答!它引导我朝着正确的方向前进,我现在发现了问题所在(见下文)
    • 您知道当前版本 1.1.7 是否仍然如此吗?
    【解决方案2】:

    psanford 的评论让我找到了答案。事实证明,Cassandra

    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 切片在长行上很慢,这就是为什么我在行尾看到性能不佳的原因(我的数据是按列顺序插入的)。

    这可以通过手动调用 cassandra 节点上的刷新来解决。已将补丁应用于 1.1.0 以解决此问题,我可以确认这为我解决了问题。

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

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2017-06-15
      • 2018-01-12
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多