events - El mejor enfoque para Cassandra(¿+ Spark?) Para consultas continuas?
apache-spark cassandra-2.0 (4)
No soy un experto en chispa, así que tome esto con un grano de sal, pero tal vez podría utilizar un enfoque como este:
Use la transmisión de chispa para el análisis en tiempo real de la secuencia de datos entrantes y envíe actualizaciones de posición a los clientes en tiempo real.
Use Cassandra para obtener un almacenamiento persistente, vistas en caché y conjuntos de datos desde los cuales los clientes pueden obtener datos.
Por lo tanto, escribiría una aplicación de transmisión de chispa que se conecta a su flujo de datos entrantes, presumiblemente uno que informa las posiciones de envío a intervalos regulares. Cuando recibe una posición de barco, buscaría la última posición conocida del barco en Cassandra (previamente almacenada en una serie temporal agrupada de posiciones para esa identificación del barco, ordenada por orden inverso, de modo que la posición más reciente sea la primera fila) . Si la posición del barco ha cambiado, la aplicación de chispa insertaría una nueva fila de series de tiempo en Cassandra y empujaría la nueva posición a su cliente en tiempo real.
Spark también estaría escribiendo otras actualizaciones para Cassandra para cosas que los clientes quieran saber, como una tabla de cuántos barcos hay actualmente en la bahía de San Francisco. Cuando el cliente hace clic en la bahía, se consulta la tabla de resumen para extraer esa información y mostrarla. Todo lo que necesite un tiempo de respuesta rápido en el cliente debe ser precalculado por chispa y almacenado en Cassandra para su recuperación rápida.
Cuando se inicia un nuevo cliente, primero consulta (extrae de) a Cassandra para obtener la posición actual de todos los barcos, y luego las actualizaciones en tiempo real de esos datos se enviarán desde la aplicación de chispa.
Actualmente estamos usando Hazelcast ( http://hazelcast.org/ ) como una cuadrícula de datos en memoria distribuida. Eso ha funcionado bien para nosotros, pero el hecho de ir únicamente a la memoria ha agotado su camino en nuestro caso de uso, y estamos considerando transferir nuestra aplicación a una tienda persistente NoSQL. Después de las comparaciones y evaluaciones habituales, estamos en el límite de escoger a Cassandra, más eventualmente a Spark para análisis.
No obstante, hay una brecha en nuestras necesidades arquitectónicas que todavía no estamos entendiendo cómo resolver en Cassandra (con o sin Spark): Hazelcast nos permite crear una consulta continua en eso, cada vez que se agrega / elimina / modifica una fila de el conjunto de resultados de la cláusula, Hazelcast vuelve a llamar con la notificación correspondiente. Usamos esto para actualizar continuamente a los clientes a través de la transmisión AJAX con las filas nuevas / modificadas.
Probablemente se trata de un desajuste conceptual que estamos haciendo, entonces, ¿cómo abordar mejor este caso de uso en Cassandra (con o sin la ayuda de Spark)? ¿Hay algo en la API que permita realizar consultas continuas sobre cambios de clave / cláusula (no lo ha encontrado)? ¿Hay alguna otra forma de obtener una secuencia de actualizaciones de clave / cláusula? Eventos de algún tipo?
Soy consciente de que podríamos, eventualmente, sondear periódicamente a Cassandra, pero en nuestro caso de uso, el cliente está potencialmente interesado en una gran cantidad de notificaciones de cláusulas de tabla (piense en "todos los cambios en las posiciones de Buque en la costa de California") e itere de la tienda mataría la escalabilidad de la serpentina.
Por lo tanto, la pregunta mágica: ¿qué nos estamos perdiendo? ¿Es Cassandra la herramienta equivocada para el trabajo? ¿No somos conscientes de una parte particular de la API o biblioteca externa dentro / fuera del ámbito de apache que permitiría esto?
Muchas gracias por cualquier ayuda!
Hugo
Use la transmisión de chispa. Cuando se necesita una actualización, lleve a cabo dos operaciones:
- Haga un saveToCassandra que actualizará los datos de cassandra para futuras consultas.
- Empuje hacia abajo el cambio a los clientes usando lo que sea que esté usando. Podría hacer la notificación AJAX de Spark Streaming si su inserción de AJAX se puede poner en el código del cliente de transmisión. De lo contrario, puede enviar un mensaje a algún proxy que se retransmitiría a los clientes de Ajax.
Tu código podría verse más o menos así:
val notifications = ssc.whateverSourceYouHaveThatGivesADstream(...)
notifications.foreachRDD(x => {
x.foreachPartition(x => {
cassandraConnector.withSessionDo(session => {
x.foreach(y => {
//use session to update cassandra
// broadcast via AJAX or send to proxy to broadcast
})
})
})
})
Espero que ayude.
Mira el servidor de Spark Job
Probablemente quiera echar un vistazo al Servidor Spark Job
Te permite hacer cosas como compartir contextos de chispa (y, por lo tanto, cambiar los RDD) entre diferentes trabajos.
Y proporciona una API relajante para la chispa en tiempo real (según la frecuencia de actualización del caché) de las consultas.
Spark Cassandra Connector puede ayudar. Es compatible con la transmisión de la tabla de cassandra:
import com.datastax.spark.connector.streaming._
val ssc = new StreamingContext(sparkConf, Seconds(1))
val rdd = ssc.cassandraTable("streaming_test", "key_value").select("key", "value").where("fu = ?", 3)