【问题标题】:cassandra database - fetch huge amount of datacassandra 数据库 - 获取大量数据
【发布时间】:2020-11-28 10:02:30
【问题描述】:

有一个 cassandra 2.x 数据库,我必须使用非主键列从一个表中选择一些数据,该列是另一个表的主键,使用简单的 where 子句。 数据在缓存中使用。 问题是检索过程太慢并且使用 datastax 3.x 驱动程序超时。 有什么方法可以在不升级数据库软件或改变现有数据库结构的情况下获取数据。 我尝试使用 datastax api 进行异步获取和分页 - 仍然无法处理数据量并且查询失败。

【问题讨论】:

    标签: performance cassandra


    【解决方案1】:

    Cassandra 已针对按主键(完整键、部分键或至少分区键)访问数据进行了高度优化。其他访问模式需要额外的工作。从理论上讲,您可以在相应列上使用二级索引,但仅在搜索数据时才建议您使用至少具有分区键的数据 - 如果您仅单独使用该列,它仍然会到达所有节点并获取所有数据,所以它会慢得多。而且您需要记住其他限制,例如列的基数等(您可以阅读here)。

    以编程方式,您也可以对数据进行全面扫描,但它不应该是简单的select * from table,因为它会使协调节点过载,导致超时等。相反,它应该是更复杂的解决方案 - 最好是通过从各个令牌范围读取数据来执行扫描,将查询发送到保持相应范围的节点,并且可以并行执行 - 这就是 Spark Cassandra ConnectorDSBulk 的工作方式(我认为您可以尝试为该任务采用 DSBulk 代码片段——可以将其用作库)。我也有 an example of how to perform full table scan 使用 Java 驱动程序 - 您可以采用此代码,并将简单计数替换为您的过滤条件。

    【讨论】:

    • 嗨,Alex Ott,感谢您的宝贵建议。我花了一些时间来解决问题并测试您的解决方案。基于令牌的全表扫描适用于非索引过滤器,而不适用于其他库。
    • datastax 驱动程序还有一个问题 - 这次是在 in 子句中使用索引列的简单直接查询 - select * from xxxTable where xxxColumn in (x1, x2, x3,... ) 子句中的值不是固定的,并且随着算法检查而变化。但是与以前的 neflix 驱动程序(我正在移植到 datastax)相比,性能差异是巨大的 - 使用 netflix astyanax 驱动程序需要 25 毫秒的典型查询使用 datastax 需要将近 180 毫秒,即慢八倍。有什么建议可以提高响应时间以匹配驱动程序的 astyanax 吗?
    • 建议 - 不要在分区键列上使用 IN,因为它会引入额外的跃点来读取数据 - 而是使用 executeAsync 并行发出多个请求,然后在您的应用程序...
    • 也尝试使用 executeAsync。它仅将整体响应时间缩短了大约 5-10 毫秒。仍然没有接近 astyanax 驱动程序的响应时间。
    • 您在使用准备好的查询吗?如果没有,那么它将无济于事,因为驱动程序不知道如何路由查询
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多