在Cassandra表中快速估算行数

7

我很惊讶之前没有提出这个问题。

假设我们在cassandra中有一个巨大的表,我们需要获取它的行数的估计值(不是精确值,只是近似值)。

显然,简单的select count(*) from table不是高效的,可能需要很长时间。我们需要一些“脏”而快速的方法。

Datastax博客建议如下

我不关心精确数字,能给我个大概的估算吗?

因为Cassandra知道每个SSTable中有多少行,所以可以得到一个估计值。“nodetool cfstats”输出告诉你这些计数在“Number of Keys (estimate)”行中。这是每个SStable中行数的总和(由于使用的索引而再次近似,但默认情况下不能超过128)。

我的问题是:我们能否使用DataStax企业Java驱动程序执行相同的操作?

P.S.我无法更改表结构或其他任何内容。考虑到我使用的是旧架构,换句话说,我不感兴趣的是像添加计数器或其他特殊字段这样的解决方法。


如果没有自动方式,您可以只存储一个计数器。 - Don Branson
@DonBranson 如果我在生产环境中已经有一个遗留的数据库,这将无法工作。 - Andremoniy
是的,不太好。将计数器初始化为nodetool的估计值可以得到一个粗略的值。这取决于您能容忍多少粗略的值。如果您可以通过API获得某些内容,那肯定会更好。 - Don Branson
1个回答

8

Cassandra通过JMX还可以获取“nodetool cfstats”获取的近似计数。代码可以钩入此JMX指标以编程方式获取计数。

EstimatedPartitionCount Gauge 表中键的近似数量。

 {
    "type": "READ",
    "mbean": "org.apache.cassandra.metrics:type=Table,keyspace=*,scope=*,name=*",
    "attribute": "Count"
  }

这里有一个关于所有JMX指标的链接


对于提供的解决方案有任何问题或评论吗?如果没有,您可以接受答案。 - dilsingi
JMX这种黑客方式在生产代码中不起作用。但是对于这个解决方案给予+1的支持。 - Andremoniy
@Andremoniy JMX是所有监控工具用于连接Cassandra指标的方式。 - dilsingi
正如你所想象的那样,监控几乎每隔几秒钟就会轮询数据。因此,我不认为应用程序不能复制这种行为的原因。 - dilsingi
因为我无法使用JMX端口,我只能访问Thrift。 - Andremoniy
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接