J'ai trois nœuds Cassandra Cluster et j'ai créé une table qui a plus de 2 000 000 de lignes.
Lorsque j'exécute cette requête (select count(*) from userdetails
) dans cqlsh, j'ai l'erreur suivante:
OperationTimedOut: errors = {}, last_Host = 192.168.1.2
Lorsque je lance la fonction de décompte pour moins de rangées ou avec une limite de 50 000, tout fonctionne correctement.
count (*) fait défiler toutes les données. Donc, un select count(*) from userdetails
sans limite devrait expirer avec autant de lignes. Quelques détails ici: http://planetcassandra.org/blog/counting-key-in-cassandra/
Vous pouvez envisager de conserver vous-même le décompte en utilisant Spark ou, si vous souhaitez simplement obtenir un numéro de parcage, vous pouvez le récupérer auprès de JMX.
Extraire de JMX peut être un peu difficile en fonction de votre modèle de données. Pour obtenir le nombre de partitions, saisissez le org.Apache.cassandra.metrics:type=ColumnFamily,keyspace={{Keyspace}},scope={{Table}},name=EstimatedColumnCountHistogram
mbean et récapitulez les 90 valeurs (c’est ce que nodetool cfstats
affiche). Il ne vous donnera que le nombre qui existe dans sstables, donc pour le rendre plus précis, vous pouvez faire une couleur ou essayer d'estimer le nombre dans les tables de mémoire à partir de la variable MemtableColumnsCount
mbean
Vous pouvez également augmenter le délai d’expiration dans la commande cqlsh, par exemple:
cqlsh --request-timeout 120 myhost
Pour modifier le délai d'expiration du client dans Apache Cassandra, il existe deux techniques:
Technique 1: Modifiez le fichier cqlshrc.
Technique 2: Ouvrez le programme cqlsh et modifiez l'heure spécifiée à l'aide de la variable client_timeout.
Pour plus de détails, veuillez consulter le lien: https://playwithcassandra.wordpress.com/2015/11/05/cqlsh-increase- timeout-limit/
J'utilise Cassandra 3.4 et cqlsh pour obtenir le nombre d'enregistrements. Il semble qu'il y ait eu un changement de code en 3.4. cqlsh appelle simplement cqlsh.py. Dans cqlsh.py se trouve une variable DEFAULT_REQUEST_TIMEOUT_SECONDS
dont la valeur par défaut est 10 (secondes). Je l'ai changé en 3600 (1 heure) et maintenant mes requêtes SELECT count(*)
fonctionnent.
si vous utilisez cqlsh: ouvrez le script dans l'éditeur et trouvez tous les mots "timeout". Modifiez la valeur par défaut de 10 à 60 et enregistrez le script.
J'utilise Cassandra 3.11 et cqlsh pour obtenir le nombre d'enregistrements. Ma table est d'environ 40 000 000 lignes et j'ai été forcé avec ce problème. mon problème résolu avec deux changements:
tout d'abord, changez toutes les configurations de délai d'attente dans 'cassandra.yaml' sur tous les noeuds:
# 3,600,000 is one hour in ms
read_request_timeout_in_ms: 3600000
range_request_timeout_in_ms: 3600000
write_request_timeout_in_ms: 3600000
counter_write_request_timeout_in_ms: 3600000
cas_contention_timeout_in_ms: 3600000
truncate_request_timeout_in_ms: 3600000
request_timeout_in_ms: 3600000
slow_query_log_timeout_in_ms: 3600000
puis redémarrez Cassandra sur tous les nœuds.
et la seconde est en cours d'exécution 'cqlsh' avec le délai d'expiration spécifié comme ci-dessous:
cqlsh --request-timeout=3600000 <myhost>
ayant le même problème que vous ci-dessus si je compte un jour, mais comme solution de contournement, je scie le compte en deux demandes (12 heures + 12 heures), comme ci-dessous.
cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 00:00:00' and insert_time <= '2015-08-20 11:59:59' ALLOW FILTERING;
count
-------
42528
(1 rows)
cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 12:00:00' and insert_time <= '2015-08-20 23:59:59' ALLOW FILTERING;
count
-------
86580
(1 rows)
cqlsh:jw_schema1>