【问题标题】:How to get total no of rows in a cassandra column family using Java?如何使用 Java 获取 cassandra 列族中的总行数?
【发布时间】:2019-08-08 14:00:27
【问题描述】:

我想获取列族中的总行数。我知道使用 nodetool cfstats 我们可以获得大约行。但是如何使用 Java Client 获取它。

【问题讨论】:

  • 如果您能向我们展示您的表格、您的代码、您尝试过的内容等...我们甚至不知道family 的表格是什么样的
  • 你的意思是用赫克托标记这个吗?你在用节俭吗?

标签: cassandra cassandra-2.0 hector


【解决方案1】:

我能够做到这一点的唯一方法是编写基本上执行“select * from”然后一次获取小行的代码。计数器实际上是由 java 代码维护的,而不是 cassandra。不幸的是,对于 cassandra,读取超时时间很小(one/local_one 为 5 秒,其他任何时间为 10 秒)。您必须降低提取大小,以免每次提取都超时。如果表很大,完成计数可能需要一段时间,但它确实有效。请记住,当您的查询运行时,计数可能会发生变化,因此它本身就是一个“估计”。如果你有兴趣,我有一段模块化的 java 代码。

【讨论】:

  • 请不要这样做!你正在杀死集群
  • 是的,它不漂亮,但对于那些需要确切数字的人来说,这是唯一的方法(据我所知)。
【解决方案2】:

您可以查询system.size_estimates 表以获取单个主机上分区预范围的大致大小。根据集群的大小和 RF,您可以从中做出大致的估计。这真的取决于你想要它有多准确。对于精确测量,我会推荐 Spark,但如果您确实需要对其进行运行时跟踪,则可能值得使用一个计数器,您可以通过更改更新以快速读取数据。

【讨论】:

    【解决方案3】:

    正如 Chris 所说,您可以通过 JMX 指标获得大致的行数,并且可以通过 Spark 完成更精确的计算。如果您需要通过 Java 客户端执行此操作,那么您需要执行类似于 Spark 的操作 - 按令牌范围执行行计数 - 在这种情况下,您发出由各个主机执行的查询,而无需如果您很天真select * from table,就会使协调器超载。查询看起来像这里(它是伪代码,不是真正的查询!SELECT columns FROM table WHERE token(pk) > token_range.begin AND token(pk) <= token_range.end。应该在那里完成的技巧是您需要显式设置路由密钥,因为令牌感知负载平衡策略无法自动从该查询中提取它。

    完整的源代码很长,在这里包含,但你可以找到它here

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 2013-11-01
      • 2010-12-29
      • 2014-05-11
      • 2014-04-27
      • 2011-11-03
      • 2013-10-28
      • 1970-01-01
      相关资源
      最近更新 更多