2012-03-16 14 views
8

Estoy buscando implementar un CF en Cassandra que tenga filas muy largas (cientos de miles o millones de columnas por fila).Rendimiento de Cassandra para filas largas

Usando datos totalmente ficticios, he insertado 2 millones de columnas en una sola fila (espaciadas uniformemente). Si hago una operación de corte para obtener 20 columnas, entonces estoy notando una degradación de rendimiento masivo a medida que realizas tu operación de corte más abajo en la fila.

Con la mayoría de las columnas, parezco poder mostrar los resultados de corte en 10-40ms, pero a medida que se acerca al final de la fila, el rendimiento llega a la pared, con tiempos de respuesta que aumentan gradualmente de 43ms en el ¡1,800,000 de marca a 214ms a 1,900,000 y 435ms a 1,999,900! (Todas las rebanadas tienen el mismo ancho).

No entiendo por qué hay esta degradación masiva en el rendimiento a medida que se llega al final de la fila. ¿Puede alguien dar alguna orientación sobre lo que Cassandra está haciendo internamente para hacer tal retraso? El almacenamiento en caché de filas está desactivado y casi todo es una instalación predeterminada de Cassandra 1.0.

Se supone que es capaz de soportar hasta 2 mil millones de columnas por fila, pero a este ritmo de aumento, el rendimiento significa que no se puede usar para filas muy largas en una situación práctica.

Muchas gracias.

Advertencia, estoy llegando a esto con 10 solicitudes en paralelo a la vez, por eso son un poco más lentas de lo que esperaba, pero es una prueba justa para todas las solicitudes e incluso las hace en serie existe esta extraña degradación entre el récord 1.800.000 y 1.900.000.

También he notado un rendimiento EXTREMADAMENTE malo cuando se realizan cortes inversos para un solo elemento al tener solo 200,000 columnas por fila: query.setRange (end, start, false, 1);

Respuesta

4

El comentario de psanford me llevó a la respuesta. Resulta que Cassandra < 1.1.0 (actualmente en beta) tiene un rendimiento lento en segmentos en filas largas en Memtables (que no se han descargado al disco) pero un mejor rendimiento en SSTables enjuagado en el disco con los mismos datos.

ver http://mail-archives.apache.org/mod_mbox/cassandra-user/201201.mbox/%[email protected].com%3E y https://issues.apache.org/jira/browse/CASSANDRA-3545.

Con mi ejemplo, el primero 1.Se han enjuagado 8 millones de filas en el disco, por lo que las rebanadas en ese rango fueron rápidas, pero las últimas ~ 200,000 filas no se habían barrido en el disco y todavía estaban en memtables. Como el corte de las membranas es lento en filas largas, esta es la razón por la que vi un mal rendimiento al final de las filas (mis datos se insertaron en orden de columnas).

Esto puede solucionarse llamando manualmente a los nodos cassandra. Se ha aplicado un parche a 1.1.0 para solucionarlo y puedo confirmar que esto solucionó el problema.

Espero que esto ayude a cualquier otra persona con el mismo problema.

9

Un buen recurso en esto es la publicación del blog de Aaron Morton en Cassandra's Reversed Comparators. Del artículo:

Recuerda de mi publicación en Cassandra Query Plans que una vez que las filas alcanzan un cierto tamaño, incluyen un índice de las columnas. Y que el índice completo debe leerse siempre que se necesite usar alguna parte del índice, que es el caso cuando se usa un Rango de corte que especifica inicio o inversión. Por lo tanto, la consulta de división más rápida para ejecutar en una fila fue una que recuperó las primeras X columnas en una fila al especificar únicamente un recuento de columnas.

Si está leyendo sobre todo desde el final de una fila (por ejemplo, si va a guardar cosas por fecha y hora, y que sobre todo desea buscar en los datos recientes) puede utilizar la Reversed Comparator que almacena las columnas en orden descendente. Esto le dará un rendimiento de consulta mucho mejor (y más consistente).

Si sus patrones de lectura son más aleatorios, es mejor que particione sus datos en varias filas.

+0

Gracias por la respuesta ¡psanford! Me condujo en la dirección correcta y ahora he encontrado cuál era el problema (ver a continuación) – agentgonzo

+0

¿Sabes si esto sigue siendo cierto para la versión actual 1.1.7? – Sisso

Cuestiones relacionadas