web-dev-qa-db-fra.com

select count (*) rencontre des problèmes de temporisation dans Cassandra

C'est peut-être une question stupide, mais je ne suis pas en mesure de déterminer la taille d'une table dans Cassandra.

C'est ce que j'ai essayé:

select count(*) from articles;

Cela fonctionne bien si la table est petite, mais une fois remplie, je rencontre toujours des problèmes de dépassement de délai:

cqlsh:

  • OperationTimedOut: errors = {}, last_Host = 127.0.0.1

DBeaver:

  • Exécution 1: 225 000 (7477 ms)
  • Course 2: 233,637 (8265 ms)
  • Exécution 3: 216 595 (7269 ms)

Je suppose que ça a un peu de retard et juste un avortement. Le nombre réel d'entrées dans la table est probablement beaucoup plus élevé.

Je teste contre une instance locale de Cassandra qui est complètement inactive. Cela ne me dérangerait pas si elle doit faire une analyse complète de la table et ne répond pas pendant cette période.

Est-il possible de compter de manière fiable le nombre d'entrées dans une table Cassandra?

J'utilise Cassandra 2.1.13.

13
Philipp Claßen

Pour autant que je vois votre problème connecté au délai d'attente de cqlsh : OperationTimedOut: errors = {}, last_Host = 127.0.0.1

vous pouvez simplement l'augmenter avec des options: 

 --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).
13
Oleksandr Petrenko

Voici ma solution actuelle:

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

Arrière-plan: Cassandra permet d’utiliser exporter une table dans un fichier texte , par exemple:

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

Cela correspond également au nombre de lignes dans le fichier généré:

$ wc -l /tmp/data.csv
3568068
9
Philipp Claßen

Existe-t-il un moyen fiable de compter le nombre d'entrées dans une table Cassandra?

La réponse simple est non. Cassandra n'est pas une limitation, mais un difficile défi pour systèmes distribués de compter les éléments uniques de manière fiable.

C'est le défi que les algorithmes d'approximation tels que HyperLogLog adressent.

Une solution possible consiste à utiliser counter dans Cassandra pour compter le nombre de lignes distinctes, mais même counters peut ne pas compter de manière erronée dans certains cas, ce qui entraînera quelques% d'erreur.

7
doanduyhai

C'est un bon utilitaire de comptage de lignes qui évite les problèmes de délai d'attente lors de l'exécution d'une grande COUNT(*) dans Cassandra:

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

3
Kat

La raison est simple:

Quand vous utilisez:

SELECT count(*) FROM articles;

cela a le même effet sur la base de données que:

SELECT * FROM articles;

Vous devez interroger tous vos nœuds. Cassandra court tout simplement un temps mort.

Vous pouvez modifier le délai d'attente, mais ce n'est pas une bonne solution. (Pour une fois c'est bien mais ne l'utilisez pas dans vos requêtes habituelles.)

Il existe une meilleure solution: demandez à votre client de compter vos lignes. Vous pouvez créer une application Java dans laquelle vous comptez vos lignes lorsque vous les insérez, puis insérez le résultat à l'aide d'une colonne de compteur dans une table Cassandra.

0
Citrullin

Vous pouvez utiliser nodetool Cassandra:

nodetool tablestats <keyspaceName>.<tableName>

Et obtenez en réponse:

Nombre de clés (estimation): count

0
darky