select count(*) s'exécute dans des problèmes de délai dans Cassandra
C'est peut-être une question stupide, mais je ne suis pas en mesure de déterminer la taille d'une table de Cassandra.
C'est ce que j'ai essayé:
select count(*) from articles;
Il fonctionne très bien si la table est petite, mais une fois qu'il se remplit, j'ai toujours courir dans des problèmes de délai d'attente:
cqlsh:
- OperationTimedOut: erreurs={}, last_host=127.0.0.1
DBeaver:
- Run 1: de 225 000 (7477 ms)
- Run 2: 233,637 (8265 ms)
- Run 3: 216,595 (7269 ms)
Je suppose qu'il frappe certains de délai d'expiration et simplement abandonnée. Le nombre réel d'entrées dans la table est probablement beaucoup plus élevé.
Je suis en essais contre un local instance de Cassandra qui est complètement inactif. Je ne me dérangerait pas si il a faire un full table scan et ne répond pas pendant ce temps.
Est-il un moyen fiable pour compter le nombre d'entrées dans un Cassandra table?
Je suis à l'aide de Cassandra 2.1.13.
Vous devez vous connecter pour publier un commentaire.
Autant que je vois que vous problème lié au délai d'attente de cqlsh: OperationTimedOut: erreurs={}, last_host=127.0.0.1
vous pouvez simplement augmenter avec les options:
cqlsh
a échoué au bout de 16 secondes avecReadTimeout: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses]
. À l'aide deCOPY TO
par @PhilippClaßen réponse était la seule façon que je pouvais calculer le nombre de lignes.Voici ma solution actuelle:
De fond: Cassandra prend en charge à
exporter une table vers un fichier texte, par exemple:
Qui correspond également au nombre de lignes dans le fichier généré:
Réponse est simple pas. Ce n'est pas un Cassandra limitation, mais un défi pour systèmes distribués pour compter les éléments uniques de manière fiable.
C'est le défi que le rapprochement des algorithmes tels que HyperLogLog adresse.
Une solution possible est d'utiliser contre Cassandra pour compter le nombre de lignes distinctes mais même compteurs peut díerreur de calcul dans certains cas de coin de sorte que vous aurez quelques % d'erreur.
C'est un bon utilitaire pour compter les lignes qui évite les problèmes de délai d'attente qui se produisent lors de l'exécution d'un grand
COUNT(*)
Cassandra:https://github.com/brianmhess/cassandra-count
La raison en est simple:
Lorsque vous êtes en utilisant:
il a le même effet sur la base de données:
Vous avez à la recherche sur tous les nœuds. Cassandra fonctionne tout simplement dans un délai.
Vous pouvez modifier le délai d'attente, mais ce n'est pas une bonne solution. (Pour une fois, c'est très bien, mais ne pas l'utiliser dans les requêtes.)
Il y a une meilleure solution: faire de votre client de compter vos lignes. Vous pouvez créer une application java où vous comptez vos rangs, vous de les insérer, et d'insérer le résultat à l'aide d'un compteur de colonne dans une Cassandra table.
Vous pouvez utiliser Cassandra nodetool:
nodetool tablestats <keyspaceName>.<tableName>
Et d'obtenir en réponse:
Nombre de touches (estimation): compter
Vous pouvez utiliser la copie pour éviter de cassandra délai d'attente se produit généralement sur count(*)
utiliser cette bash
cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/.*//'