2010-08-20 2 views
7

Ho una Cassandra ColumnFamily (0.6.4) che avrà nuove voci dagli utenti. Vorrei interrogare Cassandra per queste nuove voci in modo che possa elaborare quei dati in un altro sistema.Come interrogare Cassandra per intervallo di date

La mia sensazione era che potevo usare un TimeUUIDType come chiave per la mia voce, e quindi interrogare su un KeyRange che inizia con "" come startKey, o qualsiasi cosa fosse l'ultimoStartKey. È questo il metodo corretto?

In che modo get_range_slice crea effettivamente un intervallo? Non deve conoscere il tipo di dati della chiave? Non c'è nessuna dichiarazione del tipo di dati della chiave in nessun luogo. Nel file storage_conf.xml, si dichiara il tipo delle colonne, ma non delle chiavi. Si presume che la chiave sia dello stesso tipo delle colonne? Oppure fa un po 'di sniffing magico per indovinare?

Ho anche visto implementazioni di riferimento in cui le persone memorizzano TimeUUIDType in colonne. Tuttavia, questo sembra avere problemi di scala in quanto questa particolare chiave diventerebbe "calda" poiché ogni modifica dovrebbe aggiornarla.

Qualsiasi suggerimento in questo caso sarebbe apprezzato.

risposta

2

Quando si ordinano i dati, solo i tasti di colonna sono importanti. I dati archiviati non hanno alcuna conseguenza né il timestamp generato automaticamente. L'attributo CompareWith è importante qui. Se si imposta CompareWith come UTF8Type, le chiavi verranno interpretate come UTF8Types. Se si imposta CompareWith come TimeUUIDType, le chiavi vengono automaticamente interpretate come timestamp. Non è necessario specificare il tipo di dati. Guarda le definizioni SlicePredicate e SliceRange in questa pagina http://wiki.apache.org/cassandra/API Questo è un buon punto di partenza. Inoltre, potresti trovare utile questo articolo http://www.sodeso.nl/?p=80 Nella terza parte o giù di lì, parla di una sezione con le sue query e così via.

+0

Capisco che è possibile utilizzare i tasti di colonna per l'ordinamento. Tuttavia, se dovessi scrivere una colonna timestamp per ciascun elemento della mia collezione, scriverei costantemente su una singola famiglia di colonne, che creerebbe un punto caldo. – Doug

+0

Non ho capito il tuo commento. Potresti per favore approfondire su questo? Per quanto riguarda i tasti di colonna, Cassandra auto-ordina l'intera colonna (supercolonna) in base alla chiave (o 'nome' nella convenzione di Cassandra) non appena la memorizzi. Inoltre, se potessi elaborare un po 'di più sul tuo caso d'uso, sarebbe di aiuto :) –

0

Doug,

Scrivendo ad una sola famiglia colonna a volte in grado di creare un hot spot, se si utilizza un ordine Preservare partizionamento, ma non se si utilizza il valore di default a caso Partitioner (a meno che un sottoinsieme di utenti di creare enormemente più dati di tutti gli altri utenti!).

Se ordinati i righe dal tempo (utilizzando un partizionamento ordine Preservare) allora si sono probabilmente ancora più probabile per creare hotspot, dal momento che sarà l'aggiunta di file in sequenza e un singolo nodo sarà responsabile per ogni gamma di lo spazio delle chiavi.

0

Le colonne e le chiavi possono essere di qualsiasi tipo, poiché la chiave di riga è solo la prima colonna. Praticamente, il cluster è un anello circolare di hash e le chiavi vengono cancellate dal partizionatore per essere distribuite attorno al cluster.

Attenzione però all'utilizzo delle date come tasti di riga, poiché anche la randomizzazione del partizionamento casuale predefinito è limitata e si potrebbe finire per ingombrare i dati.

Inoltre, se tale data sta cambiando, è necessario eliminare la riga precedente poiché è possibile eseguire solo inserimenti in C *.

Ecco quello che sappiamo:

  • Un intervallo fetta è una serie di colonne in una riga con un valore iniziale e un valore finale, questo è usato principalmente per file larghe come colonne ordinate. I nomi di colonna noti definiti nella CF sono indicizzati, tuttavia in modo che possano essere richiamati specificando i nomi.
  • Una fetta chiave, una chiave associata con la gamma colonna fette restituito da Cassandra
  • L'equivalente di una clausola where utilizza indici secondari, è possibile utilizzare operatori disuguaglianza lì, tuttavia ci deve essere almeno uno uguale clausola la tua dichiarazione (vedi anche https://issues.apache.org/jira/browse/CASSANDRA-1599).
  • L'utilizzo di un intervallo di tasti è inefficace con un partizionatore casuale poiché l'hash MD5 della chiave non mantiene l'ordinamento lessicale.

Ciò che si vuole utilizzare è un indice basato Colonna Famiglia utilizzando una vasta Fila: CompositeType (TimeUUID | UserID) Affinché questa non diventare calda, aggiungere una prima chiave di significato ("chiave shard") ciò dividerebbe i dati tra i nodi come il tipo di utente o la regione.

Avere più dati del necessario in Cassandra non è un problema, è come è stato progettato, quindi quello che devi porsi è "cosa devo interrogare" e quindi progettare una famiglia di colonne per questo piuttosto che cercare di adattarlo tutto in una CF come faresti in un RDBMS.