web-dev-qa-db-fra.com

Cassandra timeout cqlsh query grand (ish) quantité de données

Je fais un projet étudiant impliquant la construction et l'interrogation d'un cluster de données Cassandra.

Lorsque ma charge de cluster était légère (environ 30 Go), mes requêtes se sont déroulées sans problème, mais maintenant qu'elle est un peu plus grande (1/2 To), mes requêtes arrivent à expiration.

Je pensais que ce problème pouvait survenir, donc avant de commencer à générer et à charger des données de test, j'avais modifié cette valeur dans mon fichier cassandra.yaml:

request_timeout_in_ms (valeur par défaut: 10000) Délai d'expiration par défaut pour d'autres opérations diverses.

Cependant, lorsque j'ai changé cette valeur pour aimer 1000000, alors cassandra apparemment suspendu au démarrage - mais cela aurait pu être le grand délai d'attente au travail.

Mon objectif pour la génération de données est de 2 To. Comment puis-je interroger ce grand espace sans rencontrer de délais?

requêtes:

SELECT  huntpilotdn 
FROM    project.t1 
WHERE   (currentroutingreason, orignodeid, origspan,  
        origvideocap_bandwidth, datetimeorigination)
        > (1,1,1,1,1)
AND      (currentroutingreason, orignodeid, origspan,    
         origvideocap_bandwidth, datetimeorigination)
         < (1000,1000,1000,1000,1000)
LIMIT 10000
ALLOW FILTERING;

SELECT  destcause_location, destipaddr
FROM    project.t2
WHERE   datetimeorigination = 110
AND     num >= 11612484378506
AND     num <= 45880092667983
LIMIT 10000;


SELECT  origdevicename, duration
FROM    project.t3
WHERE   destdevicename IN ('a','f', 'g')
LIMIT 10000
ALLOW FILTERING;

J'ai un espace clé de démonstration avec les mêmes schémas, mais une taille de données beaucoup plus petite (~ 10 Go) et ces requêtes fonctionnent très bien dans cet espace clé.

Toutes ces tables interrogées ont des millions de lignes et environ 30 colonnes dans chaque ligne.

18
slmyers

Je suppose que vous utilisez également des index secondaires. Vous découvrez par vous-même pourquoi les requêtes d'index secondaire et les requêtes ALLOW FILTERING ne sont pas recommandées ... car ce type de modèles de conception ne s'adapte pas aux grands ensembles de données. Reconstruisez votre modèle avec des tables de requête qui prennent en charge les recherches de clé primaire, car c'est ainsi que Cassandra est conçu pour fonctionner.

Modifier

"Les variables qui sont contraintes sont des clés de cluster."

Bon ... ce qui signifie que ce ne sont pas des clés de partition. Sans contraindre vos clés de partition, vous analysez essentiellement votre table entière, car les clés de cluster ne sont valides (données de cluster) que dans leur clé de partition.

Modifier 20190731

Donc, même si je peux avoir la réponse "acceptée", je peux voir qu'il y a trois réponses supplémentaires ici. Ils se concentrent tous sur la modification du délai d'expiration de la requête, et deux d'entre eux surclassent ma réponse (un par un peu).

Comme cette question continue à accumuler des pages vues, je me sens obligé d'aborder l'aspect de l'augmentation du délai d'attente. Maintenant, je ne suis pas sur le point de downvote les réponses de quiconque, car cela ressemblerait à des "raisins aigres" du point de vue du vote. Mais je peux expliquer pourquoi je ne pense pas que cela résout quoi que ce soit.

Premièrement, le fait que la requête expire, est un symptôme ; ce n'est pas le problème principal. Par conséquent, l'augmentation du délai d'expiration de la requête est simplement une solution bandaid, masquant le problème principal.

Le principal problème est bien sûr que l'OP essaie de forcer le cluster à prendre en charge une requête qui ne correspond pas au modèle de données sous-jacent. Tant que ce problème est ignoré et soumis à des solutions de contournement (au lieu d'être traité directement), ce problème continuera à se manifester.

Deuxièmement, regardez ce que le PO essaie réellement de faire:

Mon objectif pour la génération de données est de 2 To. Comment puis-je interroger ce grand espace sans rencontrer de délais?

Ces délais d'expiration de requête sont là pour protéger votre cluster. Si vous deviez exécuter une analyse complète de la table (ce qui signifie une analyse complète du cluster vers Cassandra) à travers 2 To de données, ce seuil d'expiration serait assez élevé. En fait, si vous avez réussi à trouver le bon numéro pour permettre cela, votre nœud coordinateur basculerait [~ # ~] long [~ # ~] avant que la plupart des données soient assemblées dans l'ensemble de résultats.

En résumé, l'augmentation des délais d'expiration des requêtes:

  1. Donne l'apparence "d'aider" en forçant Cassandra à travailler contre la façon dont il a été conçu.

  2. Peut potentiellement planter un nœud, mettant en danger la stabilité du cluster sous-jacent.

Par conséquent, l'augmentation des délais d'expiration des requêtes est une terrible, TERRIBLE IDEA.

6
Aaron

Si vous utilisez Datastax cqlsh, vous pouvez spécifier les secondes d'expiration du client comme argument de ligne de commande. La valeur par défaut est 10.

$ cqlsh --request-timeout=3600

Documentation Datastax

49
gcarvelli

Pour modifier le délai d'expiration du client dans Apache Cassandra, il existe deux techniques:

Technique 1: C'est une bonne technique:

1. Navigate to the following hidden directory under the home folder: (Create the hidden directory if not available)

    $ pwd
    ~/.cassandra


2. Modify the file cqlshrc in it to an appropriate time in seconds: (Create the file if not available)

    Original Setting:

        $ more cqlshrc
        [connection]
        client_timeout = 10
        # Can also be set to None to disable:
        # client_timeout = None
        $

    New Setting:

        $ vi cqlshrc
        $ more cqlshrc
        [connection]
        client_timeout = 3600
        # Can also be set to None to disable:
        # client_timeout = None
        $

    Note: Here time is in seconds. Since, we wanted to increase the timeout to one hour. Hence, we have set it to 3600 seconds.

Technique 2: Ce n'est pas une bonne technique car vous modifiez le paramètre dans le programme client (cqlsh) lui-même. Remarque: Si vous avez déjà changé en utilisant la technique 1 - alors il remplacera le temps spécifié en utilisant la technique 2. Depuis, les paramètres de profil ont la priorité la plus élevée.

1. Navigate to the path where cqlsh program is located. This you can find using the which command:

    $ which cqlsh
    /opt/Apache-cassandra-2.1.9/bin/cqlsh
    $ pwd
    /opt/Apache-cassandra-2.1.9/bin
    $ ls -lrt cqlsh
    -rwxr-xr-x 1 abc abc 93002 Nov  5 12:54 cqlsh


2. Open the program cqlsh and modify the time specified using the client_timeout variable. Note that time is specified in seconds.
$ vi cqlsh

In __init__ function:
    def __init__(self, hostname, port, color=False,
                 username=None, password=None, encoding=None, stdin=None, tty=True,
                 completekey=DEFAULT_COMPLETEKEY, use_conn=None,
                 cqlver=DEFAULT_CQLVER, keyspace=None,
                 tracing_enabled=False, expand_enabled=False,
                 display_time_format=DEFAULT_TIME_FORMAT,
                 display_float_precision=DEFAULT_FLOAT_PRECISION,
                 max_trace_wait=DEFAULT_MAX_TRACE_WAIT,
                 ssl=False,
                 single_statement=None,
                 client_timeout=10,
                 connect_timeout=DEFAULT_CONNECT_TIMEOUT_SECONDS):

In options.client_timeout setting:
    options.client_timeout = option_with_default(configs.get, 'connection', 'client_timeout', '10')

You can modify at both these places. The second line picks up client_timeout information from the cqlshrc file.
8
Sashank Bhogu