【问题标题】:Fetching millions of records from cassandra using spark in scala performance issue在scala性能问题中使用spark从cassandra中获取数百万条记录
【发布时间】:2019-12-08 22:13:34
【问题描述】:

我已尝试在本地计算机上使用单节点集群和 3 节点集群使用 spark 从 cassandra 获取 250 万个条目,但在这两种情况下,仅 SELECT COUNT(*) from table 就需要 30 秒。我需要这个和类似的其他计数来进行实时分析。

SparkSession.builder().getOrCreate().sql("SELECT COUNT(*) FROM data").show()

【问题讨论】:

    标签: scala apache-spark cassandra


    【解决方案1】:

    在不使用 Spark 的情况下直接运行此查询需要多少时间?我认为不可能并行化 COUNT 查询,因此您不会从使用 Spark 执行此类查询中受益。

    【讨论】:

    • 由于超时,我无法在没有 spark 的情况下直接在 Cqlsh 上进行计数。
    • 那么你应该修复你的 cqlsh 设置。见stackoverflow.com/a/40053579/5385041
    • 为此增加超时设置在 cassandra 中是个坏主意
    【解决方案2】:

    Cassandra 的设计目的不是在像这样的单个昂贵查询中迭代整个数据集。如果 data 中有 10 PB,例如此查询需要从磁盘读取 10 PB,将其放入内存,将其流式传输到协调器,协调器将解决墓碑/重复数据删除(您不能只让每个副本发送一个计数,否则您将大量少/多计数)并增加一个计数器。这在 5 秒超时后不起作用。您可以在较小的数据块上使用聚合函数,但不能在单个查询中使用。

    如果你真的想让它像这样工作,请查询每个节点的system.size_estimates 表,并根据大小对每个范围进行拆分,这样每次读取的最大值约为 5k。然后为每个拆分范围发出一个计数(*),并结合所有这些查询的值。这就是 spark 连接器在 SELECT * rrds 中进行全表扫描的方式,因此您只需复制它即可。

    最简单、可能更安全、更准确(但效率较低)的是使用 spark 仅读取整个数据集然后计数,而不是使用聚合函数。

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 2015-10-28
      • 2014-05-24
      • 1970-01-01
      • 2017-01-24
      • 2016-03-06
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多