2016-04-20 31 views
9

Forse è una domanda stupida, ma non sono in grado di determinare le dimensioni di un tavolo in Cassandra.select count (*) viene eseguito in problemi di timeout in Cassandra

Questo è quello che ho provato:

select count(*) from articles;

Funziona benissimo se la tabella è piccola, ma una volta che si riempie, ho sempre incorrere in problemi di timeout:

cqlsh:

  • OperationTimedOut: errors = {}, last_host = 127.0.0.1

DBeaver:

  • Run 1: 225.000 (7477 ms)
  • Run 2: 233.637 (8265 ms)
  • Run 3: 216,595 (7269 ms)

suppongo che colpisce un certo timeout e abortisce. Il numero effettivo di voci nella tabella è probabilmente molto più alto.

Sto testando un'istanza Cassandra locale completamente inattiva. Non mi dispiacerebbe se deve eseguire una scansione completa della tabella e non risponde durante quel periodo.

C'è un modo per contare in modo affidabile il numero di voci in una tabella Cassandra?

Sto usando Cassandra 2.1.13.

risposta

9

Per quanto ti vedo problema collegato al timeout di cqlsh : OperationTimedOut: errori = {}, last_host = 127.0.0.1

è possibile semplice aumento con opzioni:

--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). 
+0

Grazie! Sì, con un timeout aumentato, SELECT restituisce il numero previsto di elementi. –

+0

L'aumento di entrambi i timeout non ha funzionato per me:/Ho impostato entrambi su 100 secondi, ma 'cqlsh' non è riuscito dopo 16 secondi con' ReadTimeout: Errore dal server: codice = 1200 [Il nodo coordinatore è scaduto in attesa delle risposte dei nodi di replica] '. L'utilizzo di "COPY TO' per [@ PhilippClaßen's answer] (https://stackoverflow.com/a/36745042/1727828) era l'unico modo per calcolare il conteggio delle righe. – mksios

5

Qui è la mia soluzione attuale:

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

Background: Cassandra supporti per export a table to a text file, per esempio:

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

che corrisponde anche il numero di righe nel file generato:

$ wc -l /tmp/data.csv 
3568068 
+0

Il comando COPY è essenzialmente facendo una scansione completa del cluster come COUNT (*), e questa soluzione non verrà scalata. Come altri hanno già detto, dovrai accontentarti di un conteggio di fila approssimativo per mantenere la velocità e la stabilità nel tuo cluster. Le opzioni sono. Contrastare colonne, hyperloglog o leggere i metadati delle tabelle ti fornirà una stima di quante partizioni ci sono. – fromanator

+0

Sto bene sacrificando la scalabilità, poiché la mia intenzione era solo quella di capire cosa succede nel mio ambiente di sviluppo locale. Sono d'accordo che non è una soluzione che può essere utilizzata in produzione. –

0

La ragione è semplice:

quando si utilizza:

SELECT count(*) FROM articles; 

ha lo stesso effetto sul database come:

SELECT * FROM articles; 

Bisogna interrogare su tutti i nodi. Cassandra si imbatte semplicemente in un timeout.

È possibile modificare il timeout, ma non è una buona soluzione. (Per una volta va bene, ma non usarlo nelle tue normali domande.)

C'è una soluzione migliore: fai in modo che il tuo cliente conti le tue righe.Puoi creare un'app java dove conti le tue righe, quando le inserisci e inserisci il risultato utilizzando una colonna contatore in una tabella Cassandra.

7

C'è un modo per contare in modo affidabile il numero di voci in una tabella Cassandra?

risposta normale è non. Non è una limitazione di Cassandra ma una sfida difficile per i sistemi distribuiti per contare gli articoli unici in modo affidabile.

Questa è la sfida che algoritmi di approssimazione come l'indirizzo HyperLogLog.

Una possibile soluzione è quella di utilizzare contatore a Cassandra per contare il numero di righe distinte, ma anche contatori può miscount in alcuni casi angolo quindi si otterrà un errore di qualche%.

1

È possibile utilizzare Cassandra nodetool:

nodetool tablestats <keyspaceName>.<tableName>

E ottenere in risposta:

Numero di tasti (stima): Numero

+0

basato sulla documentazione ufficiale (http://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsTablestats.html) Il numero di chiavi è il numero di chiavi di partizione per questa tabella, non il numero di chiavi primarie. Questo ti dà il numero stimato di partizioni nella tabella. –