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

时间:2016-04-20 12:44:25

标签: cassandra cql

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

这就是我的尝试:

select count(*) from articles;

如果表格很小,它可以正常运行,但一旦填满,我总会遇到超时问题:

cqlsh:

  • OperationTimedOut:errors = {},last_host = 127.0.0.1

DBeaver:

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

我认为它会超时并且只是中止。表中的实际条目数可能要高得多。

我正在测试一个完全空闲的本地Cassandra实例。我不介意它是否必须进行全表扫描并且在此期间没有响应。

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

我正在使用Cassandra 2.1.13。

7 个答案:

答案 0 :(得分:13)

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

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

<tabset justified="true" class="tabsetnowrap">
<tab ng-repeat="tab in tabshomepage track by $index" heading="{{tab.title}}" ng-click="homePageNavigate(tab.type)" active="tab.active" disabled="tab.disabled">
</tab>

答案 1 :(得分:10)

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

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

答案 2 :(得分:8)

  

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

简单回答是。这不是 Cassandra 限制,而是分布式系统难以可靠地计算唯一项目。

HyperLogLog 等近似算法的挑战。

一种可能的解决方案是在Cassandra中使用计数器来计算不同行的数量,但即使计数器也会在某些极端情况下计算错误,因此您将获得一个几个%的错误。

答案 3 :(得分:3)

这是一个很好的计数行,可以避免在Cassandra中运行大COUNT(*)时发生的超时问题:

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

答案 4 :(得分:0)

您可以使用Cassandra nodetool:

nodetool tablestats <keyspaceName>.<tableName>

得到回应:

键数(估计值):计数

答案 5 :(得分:0)

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

使用此bash

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

答案 6 :(得分:-1)

原因很简单:

当你使用时:

SELECT count(*) FROM articles;

它对数据库的影响与:

相同
SELECT * FROM articles;

您必须查询所有节点。卡桑德拉只是暂停了。

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

有一个更好的解决方案:让您的客户计算您的行数。您可以在插入它们时创建一个计算行数的Java应用程序,并使用Cassandra表中的计数器列插入结果。