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

7bsow1i6  于 2023-10-18  发布在  Cassandra
关注(0)|答案(7)|浏览(151)

也许这是一个愚蠢的问题,但我不能确定Cassandra中表的大小。
这就是我所尝试的:
select count(*) from articles;
如果表很小,它工作得很好,但一旦它填满了,我总是遇到超时问题:
cqlsh:

  • 操作超时:错误={},last_host=127.0.0.1

DBeaver:

  • 运行1:225,000(7477 ms)
  • 运行2:233,637(8265 ms)
  • 运行3:216,595(7269 ms)

我假设它遇到了一些超时,只是中止。表中条目的实际数量可能要高得多。
我正在测试一个完全空闲的本地Cassandra示例。我不介意它必须做一个完整的表扫描,并在这段时间内没有React。

是否有一种方法可以可靠地计算Cassandra表中的条目数量?

我用的是Cassandra 2.1.13

zengzsys

zengzsys1#

以下是我目前的解决方案:

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
mfpqipee

mfpqipee2#

据我所知,你的问题与cqlsh的超时有关:操作超时:错误={},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).
2ledvvac

2ledvvac3#

有没有一种方法可以可靠地计算Cassandra表中的条目数量?
简单的回答是。这不是一个Cassandra限制,而是分布式系统可靠地计数唯一项的一个艰巨挑战。
这就是近似算法(如HyperLogLog)所面临的挑战。
一个可能的解决方案是在Cassandra中使用counter来计算不同行的数量,但即使是counters在某些情况下也会错误计数,因此您会得到几个%的错误。

vom3gejh

vom3gejh4#

这是一个很好的计数行的实用程序,可以避免在Cassandra中运行大型COUNT(*)时发生的超时问题:
https://github.com/brianmhess/cassandra-count

s4n0splo

s4n0splo5#

原因很简单:
当您使用时:

SELECT count(*) FROM articles;

它对数据库的影响与以下相同:

SELECT * FROM articles;

你必须查询你所有的节点。Cassandra只是进入了暂停。
您可以更改超时,但这不是一个好的解决方案。(有一次它很好,但不要在常规查询中使用它。
有一个更好的解决方案:让你的客户数你的行您可以创建一个Java应用程序,在插入行时对行进行计数,并使用Cassandra表中的计数器列插入结果。

bwleehnv

bwleehnv6#

你可以使用copy来避免cassandra超时通常发生在count(*)上
使用此bash
cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'

g0czyy6m

g0czyy6m7#

您可以在使用Datastaxcqlsh时将超时秒数定义为命令行选项。默认值为10。

$ cqlsh --request-timeout=3600

相关问题