select count(*) 在 Cassandra 中遇到超时问题

select count(*) runs into timeout issues in Cassandra

也许这是个愚蠢的问题,但我无法确定 Cassandra 中 table 的大小。

这是我试过的:

select count(*) from articles;

如果 table 很小,它工作正常,但一旦它填满,我总是 运行 遇到超时问题:

cqlsh:

海狸:

我假设它遇到了一些超时并且只是中止了。 table 中的实际条目数可能要高得多。

我正在针对完全空闲的本地 Cassandra 实例进行测试。我不介意它是否必须进行完整的 table 扫描并且在那段时间没有响应。

有没有办法可靠地计算 Cassandra 中的条目数 table?

我正在使用 Cassandra 2.1.13。

这是我目前的解决方法:

COPY articles TO '/dev/null';
...
3568068 rows exported to 1 files in 2 minutes and 16.606 seconds.

背景:Cassandra 支持 export a table to a text file,例如:

COPY articles TO '/tmp/data.csv';
Output: 3568068 rows exported to 1 files in 2 minutes and 25.559 seconds

这也与生成文件中的行数匹配:

$ wc -l /tmp/data.csv
3568068

原因很简单:

当您使用时:

SELECT count(*) FROM articles;

它对数据库的影响与:

SELECT * FROM articles;

您必须查询所有节点。 Cassandra 只是遇到超时。

您可以更改超时,但这不是一个好的解决方案。 (一次没问题,但不要在常规查询中使用它。)

有一个更好的解决方案:让您的客户端计算您的行数。您可以创建一个 java 应用程序,您可以在其中计算行数、插入行数,并使用 Cassandra table.

中的计数器列插入结果

Is there a way to reliably count the number of entries in a Cassandra table?

简单的答案是。这不是 Cassandra 的限制,而是 分布式系统 可靠地计算唯一项目的艰巨挑战。

这就是 HyperLogLog 等近似算法解决的挑战。

一种可能的解决方案是在 Cassandra 中使用 counter 来计算不同行的数量,但即使 counters 在某些极端情况下也可能会计算错误所以你会得到几个百分比的错误。

这是一个很好的计算行数的实用程序,它避免了在 Cassandra 中 运行 大 COUNT(*) 时发生的超时问题:

https://github.com/brianmhess/cassandra-count

据我所知,您的问题与 cqlsh 的超时有关:OperationTimedOut: errors={}, last_host=127.0.0.1

您可以通过选项简单地增加它:

 --connect-timeout=CONNECT_TIMEOUT
                       Specify the connection timeout in seconds (default: 5
                       seconds).
 --request-timeout=REQUEST_TIMEOUT
                       Specify the default request timeout in seconds
                       (default: 10 seconds).

您可以使用复制来避免 cassandra 超时通常发生在 count(*)

使用这个bash

cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'