2009-12-23 21 views
44

¿Hay alguna manera de obtener un recuento de filas (recuento de claves) de una familia de columnas individuales en Cassandra? get_count solo se puede usar para obtener el conteo de columnas.Recuento de filas de una familia de columnas en Cassandra

Por ejemplo, si tengo una familia de columnas con usuarios y deseo obtener la cantidad de usuarios. ¿Cómo podría hacerlo? Cada usuario es su propia fila.

Respuesta

-3

He estado recibiendo los recuentos de esta manera después de convertir los datos en un hash en PHP.

+3

Eso claramente no escala, ya que en algún punto el hash ya no cabe (útilmente) en el RAM de PHP. Cassandra es para cosas escalables. – MarkR

+0

Lo sé, eso es lo que me preocupa. Todavía estoy en la etapa de desarrollo y estoy buscando una mejor solución para problemas como este. –

6

Si está utilizando un particionador que preserva la orden, puede hacerlo con get_range_slice o get_key_range.

Si no lo es, deberá almacenar sus identificadores de usuario en una fila especial.

+3

¿Qué sucede si tengo millones de filas? get_range_slice se siente un poco pesado para una simple operación de conteo. ¿Estoy en lo cierto? –

+4

Tiene razón, contar objetos en bruto es relativamente costoso en sistemas distribuidos en comparación con lo que está acostumbrado en un sistema que puede mantener un índice en la memoria local. – jbellis

2

[Editar: Esta respuesta está fuera de fecha a partir de Cassandra 0.8.1 - consulte la Counters entry Cassandra en el Wiki para la forma correcta de manejar Columnas contador en Cassandra.]

Soy nuevo Cassandra, pero he metido mucho con App Engine de Google. Si no se presenta ninguna otra solución, puede considerar mantener un contador separado en una plataforma que admita operaciones de incremento atómico como memcached. Sé que Cassandra está trabajando en la funcionalidad de incremento/disminución del contador atómico, pero aún no está lista para el horario de máxima audiencia.

Solo puedo publicar un hipervínculo porque soy nuevo, por lo que para el progreso en el soporte del contador, vea el enlace en mi comentario a continuación.

Tenga en cuenta que este hilo sugiere ZooKeeper, memcached y redis como posibles soluciones. Mi preferencia personal sería memcached.

http://www.mail-archive.com/[email protected]/msg03965.html

+2

https://issues.apache.org/jira/browse/CASSANDRA-1072 para obtener información sobre el soporte del contador de Cassandra. –

+0

CounterColumn ahora es compatible con 0.8.1 y más allá de – Bamboo

+0

Gracias, Bamboo. Esta es una respuesta muy antigua y mi trabajo con Cassandra cesó en algún momento a principios de 2011. Sin embargo, actualizaré con un enlace. –

0

Siempre hay map/reduce pero que probablemente no hace falta decirlo. Si tienes eso con colmena o cerdo, puedes hacerlo para cualquier tabla del clúster, aunque no estoy seguro de que los tracktrackers conozcan la localidad de cassandra, por lo que puede tener que transmitir toda la tabla a través de la red para que tengas rastreadores de tareas en cassandra nodos pero los datos que reciben pueden ser de otro nodo de cassandra :(. Me encantaría saber si alguien lo sabe con certeza.

NOTA: estamos configurando map/reduce en cassandra principalmente porque si queremos un índice más adelante ., podemos map/reduce a uno en Cassandra

37

Si está trabajando en un gran conjunto de datos y están de acuerdo con una aproximación bastante buena, recomiendo encarecidamente utilizar el comando:

nodetool --host <hostname> cfstats 

Esto le devolverá una lista para cada familia de columnas con este aspecto:

Column Family: widgets 
SSTable count: 11 
Space used (live): 4295810363 
Space used (total): 4295810363 
Number of Keys (estimate): 9709824 
Memtable Columns Count: 99008 
Memtable Data Size: 150297312 
Memtable Switch Count: 434 
Read Count: 9716802 
Read Latency: 0.036 ms. 
Write Count: 9716806 
Write Latency: 0.024 ms. 
Pending Tasks: 0 
Bloom Filter False Postives: 10428 
Bloom Filter False Ratio: 1.00000 
Bloom Filter Space Used: 18216448 
Compacted row minimum size: 771 
Compacted row maximum size:
Compacted row mean size: 1634 

El "Número de teclas (estimación)" fila es una buena conjetura en el clúster y el rendimiento es mucho más rápido que explícita contar enfoques.

+3

¿No es el número de claves una estimación para ese nodo en particular, no para todo el clúster? –

+0

Sí lo es. La herramienta de nodo entra en contacto con ColumnFamilyStoreMBean, que utiliza ColumnFamilyStore, que utiliza DataTracker, que devuelve la suma de las estimaciones creadas por cada SSTable local. –

+3

'nodetool --host cfstats' me da https://gist.github.com/cdwijayarathna/e6b4d3d7d8c272fcfd24, pero no hay ningún atributo 'Número de claves', ¿cuál es el motivo? –

6

He encontrado un excelente artículo sobre esto aquí .. http://www.planetcassandra.org/blog/post/counting-keys-in-cassandra

select count (*) Desde el límite de cf 1000000

Por encima de la declaración se puede utilizar si tenemos un aproximado límite superior conocido de antemano. Lo encontré útil para mi caso.

+5

Mala solución: en las tablas grandes obtendrás rpc_timeout, porque escaneará toda la tabla – Vlad

Cuestiones relacionadas