2015-04-03 13 views
8

Sto facendo un progetto studentesco che prevede la creazione e l'interrogazione di un cluster di dati Cassandra.Cassandra timeout cqlsh query large (ish) quantità di dati

Quando il carico del mio cluster era leggero (circa 30 GB) le mie query si sono svolte senza problemi, ma ora che è un po 'più grande (1/2 TB) le mie query scadono.

ho pensato che questo problema potrebbe sorgere, quindi prima di iniziare la generazione e la prova di caricamento dei dati avevo cambiato questo valore nel mio file cassandra.yaml:

request_timeout_in_ms (Default: 10000) Il timeout predefinito per altre, operazioni varie.

Tuttavia, quando ho modificato tale valore su 1000000, quindi cassandra sembrava sospesa all'avvio - ma quello poteva essere solo il grande timeout al lavoro.

Il mio obiettivo per la generazione di dati è 2 TB. Come posso interrogare quel grande spazio senza incorrere in timeout?

query:

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; 

Ho uno spazio delle chiavi demo con gli stessi schemi, ma di dimensioni molto più piccole dei dati (~ 10GB) e queste query funzionano bene in questo spazio delle chiavi.

Tutte queste tabelle interrogate contengono milioni di righe e circa 30 colonne in ogni riga.

+0

di poter postare un esempio di query? – Aaron

risposta

5

Ho intenzione di indovinare che state usando anche indici secondari. Stai scoprendo in prima persona perché le query sull'indice secondario e PERMETTERE che le query FILTERING non siano raccomandate ... perché questi tipi di schemi di progettazione non sono scalabili per set di dati di grandi dimensioni. Ricostruisci il tuo modello con tabelle di query che supportano ricerche di chiavi primarie, in quanto è così che Cassandra è progettato per funzionare.

Modifica

"Le variabili che sono vincolati sono le chiavi di cluster."

Destra ... il che significa che non sono chiavi di partizione. Senza vincolare le tue chiavi di partizione, in pratica stai eseguendo la scansione dell'intera tabella, poiché le chiavi di clustering sono valide solo (dati cluster) all'interno della loro chiave di partizione.

+0

Non sto usando affatto "indici secondari". Le variabili vincolate sono 'chiavi del cluster'. Quando imposto il limite <5, la query termina. Hai altre idee su cosa posso fare per completare la query a limiti superiori a 5? edit: sto usando cqlsh per interrogare il mio database pensi che dovrei scrivere un'applicazione per gestire le query? – slmyers

+3

@slmyers "Le variabili vincolate sono le chiavi del cluster." Giusto ... il che significa che non sono chiavi di partizione. Senza vincolare le tue chiavi di partizione, in pratica stai eseguendo la scansione dell'intera tabella, poiché le chiavi di clustering raggruppano solo i dati all'interno della loro chiave di partizione. – Aaron

6

Per modificare il limite di timeout cliente in Apache Cassandra, ci sono due tecniche:

Tecnica 1: Si tratta di una buona tecnica:

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. 

Tecnica 2: Questa non è una buona tecnica in quanto, stai modificando le impostazioni nel programma client (cqlsh) stesso. Nota: se è già stato modificato utilizzando la tecnica 1, allora sostituirà il tempo specificato utilizzando la tecnica 2. Poiché, le impostazioni del profilo hanno la priorità più alta.

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. 
25

Se si utilizza Datastax cqlsh allora è possibile specificare client timeout secondi come argomento della riga di comando. L'impostazione predefinita è 10.

$ cqlsh --request-timeout=3600

Datastax Documentation

Problemi correlati