kappa data big arquitecturas arquitectura cassandra apache-spark apache-kafka lambda-architecture

cassandra - data - lambda architecture



Arquitectura Lambda con Apache Spark (3)

Estoy tratando de implementar una arquitectura Lambda con las siguientes herramientas: Apache Kafka para recibir todos los puntos de datos, Spark para procesamiento por lotes (Big Data), Spark Streaming para tiempo real (Fast Data) y Cassandra para almacenar los resultados.

Además, todos los puntos de datos que recibo están relacionados con una sesión de usuario y, por lo tanto, para el procesamiento por lotes, solo estoy interesado en procesar los puntos de datos una vez que finaliza la sesión. Entonces, como estoy usando Kafka, la única forma de resolver esto (suponiendo que todos los puntos de datos estén almacenados en el mismo tema) es que el lote busque todos los mensajes en el tema y luego ignore los que corresponden a las sesiones que aún no han terminado.

Entonces, lo que me gustaría preguntar es:

  • ¿Es este un buen enfoque para implementar la arquitectura Lambda? ¿O debería usar Haddop y Storm en su lugar? (No puedo encontrar información sobre las personas que usan Kafka y Apache Spark para el procesamiento por lotes, Map Reduce)
  • ¿Hay un mejor enfoque para resolver el problema de las sesiones de usuario?

Gracias.


Este es un buen enfoque. El uso de Spark para las capas de velocidad y por lotes le permite escribir la lógica una vez y usarla en ambos contextos.

En cuanto al tema de la sesión, ya que estás haciendo eso en modo por lotes, ¿por qué no simplemente ingestionar los datos de Kafka en HDFS o Cassandra y luego escribir consultas para sesiones completas allí? Puede usar la "conexión directa" de Spark Streaming con Kafka para hacer esto.


Actualmente estoy trabajando en la misma implementación. Uso Kafka, HBase, Spark y Spark Streaming.

Hay muchas cosas que considerar al usar estas tecnologías y probablemente no haya una respuesta simple.

Los puntos principales de Spark Streaming son que se obtiene una latencia mínima de 100 ms para los datos de la transmisión, así como otra gran queja para mí, el desorden del ordenamiento de los datos consumidos por el trabajo de transmisión. Que con una combinación de posibles rezagados resulte en una total falta de confianza de que estoy procesando los datos en un orden al menos parcial (que yo sepa, al menos). Storm supuestamente resuelve estos problemas, pero no puedo garantizarlo ya que no lo he usado.

En términos de la capa de lotes, Spark es definitivamente mejor que MapReduce, ya que es más rápido y más flexible.

Luego viene el problema con la sincronización entre el Lote y la Velocidad en términos de saber que donde los datos del trabajo por lotes se detienen, la velocidad continúa. Resuelvo ese problema haciendo que mi capa de velocidad sea también la que pone los datos en HBase antes de procesarlos.

Esto es solo un montón de puntos al azar, espero que algunos de ellos ayuden.


Me haré eco de la nota de Dean Wampler de que este es un buen enfoque, especialmente si no tienes requisitos específicos que te alejen de Spark como la herramienta de elección para las capas Batch y Speed. Para agregar:

No tiene que volver a consumir todos los datos de una sesión de un tema antes de poder procesarlo suponiendo que lo que hace con él (su reducción) es una operación asociativa. Incluso si no es asociativo (como los usuarios únicos), puede estar bien con una estimación muy precisa que se puede calcular iterativamente como Hyper Log Log. Es probable que use algún tipo de agregación con estado. En Spark puede hacerlo utilizando las funciones updateStateByKey, o preferiblemente, mapWithState.

Si está buscando ejemplos concretos sobre las tecnologías y los casos de uso que menciona, lo guiaré al curso Pluralsight, donde podrá aprender todo sobre él y practicarlo. Aplicar la arquitectura Lambda con Spark, Kafka y Cassandra.

También notaré que si lo que estás haciendo es bastante directo, y porque ya estás usando Kafka, puedes considerar Kafka Connect para persistencia HDFS y Kafka Streams para transmisión. Incluso podría usar Kafka Streams para transmitir datos directamente a Kafka y usar Kafka Connect para canalizarlo a múltiples destinos como Cassandra y ElasticSearch. Menciono Kafka Streams porque también tiene la capacidad de mantener algún estado en la memoria y realizar operaciones simples de transmisión.

¡Buena suerte!