¿Kakfa Streams o Spark Streaming?
Ya llevamos muchos años, quizás demasiados, oyendo hablar del concepto de Big Data y del reto que supone y supondrá para muchas empresas adaptarse para poder aprovechar la gran cantidad de datos que se generan y se liberan hoy en día. Ya nadie duda que todo esto es una realidad y, en los últimos años, han ido ganando cada vez más fuerza un conjunto de tecnologías enfocadas a solucionar problemas relacionados con el tratamiento de estos grandes volúmenes de datos.
Uno de los principales retos a superar, es el derivado con el procesamiento de estos datos manteniendo, en la medida de lo posible, la disponibilidad de los mismos en tiempo [casi] real y, por supuesto, sin morir en el intento.
En este artículo vamos a tratar de ver las diferencias entre Kafka Streams y Spark Streaming, dos tecnologías muy enfocadas en este aspecto, de manera que podamos tener algo más claro cuándo nos conviene usar una u otra.
Procesamiento de Streams
Las dos tecnologías seleccionadas están centradas en el procesamiento de streams de datos, así que, como paso previo, es importante entender qué es un stream de datos.
Frente a un procesamiento tradicional de la información por lotes o en procesos programados en el tiempo, un stream de datos representa un flujo constante de datos, tanto en la entrada como en la salida. Estos datos pueden provenir de diferentes fuentes y ser enviados a múltiples destinos.
Todos ellos se tratarán de manera secuencial e individualizada según sean recibidos, por lo que el procesamiento es continuo.
Aunque un stream de datos no depende de la cantidad de información que se genere, como norma general están formados por gran cantidad de datos que requieren ser tratados en tiempo casi real.
Hoy en día, la capacidad para tratar y analizar datos y la inmediatez de este tratamiento puede marcar la diferencia entre distintas compañías, por lo que estas tecnologías se han centrado en aportar la mejor solución posible de la manera más eficaz y efeciente. No obstante, para casi todas las compañías, este tipo de tratamiento de datos sigue siendo un reto a superar, ya que no todo depende de elegir la tecnología adecuada en la que apoyarse, sino que es mucho más importante el tratamiento posterior de la información y el uso que se haga de la misma.
Un ejemplo de este tipo de necesidades son todos aquellos casos relacionados con IoT, donde debe de ser recogida y analizada la información de los sensores de manera continua y ser capaz de responder, en la mayoría de los casos de manera instanténea, en función de los datos recibidos.
Kafka Streams
Dentro del stack de Apache Kafka, encontramos una solución completa para el tratamiento de streams de datos: Kafka Streams.
Se trata de un cliente que trabaja sobre los topics de Kafka cuya finalidad es analizar y procesar los datos que llegan al broker.
De esta manera, una de las características de esta solución es que depende de un broker de Kafka y que el origen de los datos a procesar será siempre uno o varios topics. Por tanto, las fuentes originales de los datos deben de ser integradas con Kafka para poder utilizar Kafka Streams. Hoy en día, dada la gran acogida que tiene Apache Kafka en todo tipo de proyectos, este no parece ser un obstáculo insalvable. No obstante, puede convertirse en un inconveniente si la incoporación de Apache Kafka al stack tecnológico actual implica grandes cambios.
Contrariamente a lo anterior, la salida de los datos no está vinculada de manera obligatoria a ningún topic de Kafka, sino que los datos tratados pueden enviarse a otras bases de datos o a otro tipo de aplicaciones.
Otra de las principales características de Kafka Streams es que es altamente flexible y escalable, y, a su vez, es capaz de procesar la información en milisegundos, con una latencia extremadamente baja, consiguiendo así tener los datos ya tratados en tiempo casi real (siempre y cuando todo esté configurado de manera correcta).
Desde un punto de vista más técnico, Kafka Streams es una librería ligera que se integrará en la aplicación que procese estos datos. Esta librería tiene una integración completa con los brokers de Apache Kafka y será la encargada de realizar todos los procesos de conexión al clúster (como un consumidor más) y recolección de datos.
Kafka Streams ofrece una API con un DSL (Domain Specific Language) que ofrece todo tipo de operaciones: filtrados, agregaciones, maps, etc. Además, introduce dos conceptos fundamentales para el tratamiento de los streams de datos:
-
KStream: Cada elemento que se integra en este stream se agrega como un elemento nuevo, sin reemplazar en ningún caso a ninguno de los elementos existentes, con independencia de que la clave del elemento coincida con la de uno ya existente.
-
KTable: Si la clave de un elemento ya existe en este tipo de stream, se actualizará la información existente en lugar de crear un nuevo elemento. En caso de que la clave no esté asignada, se creará el nuevo elemento en el stream.
De manera nativa, Kafka Streams soporta tanto el lenguaje Java como Scala.
Spark Streaming
Spark Streaming es una extensión desarrollada sobre Apache Stark, un framework genérico centrado en el procesamiento de datos.
En el caso de Spark Streaming tanto el origen como el destino de los datos puede ser cualquier fuente externa, sin depender de ninguna tecnología concreta (más allá de la necesidad de disponer de un motor de procesamianto de Apache Spark).
Desde un punto de vista más técnico, la manera de procesar los datos difiere bastante con la metodología utilizada por Kafka Streams. Si bien, en el caso de Kafka Streams los datos se tratan evento a evento (con el fin de minimizar las latencias y acercarse al tiempo real en el procesamiento), en el caso de Spark Streaming, una vez que se van recolectando los datos, se van dividiendo en pequeños lotes para ser tratados posteriormente en conjunto y en paralelo por el motor de procesamiento (opcionalmente permite la creación de operaciones en memoria). Estos lotes serán enviados como salida una vez tratada en su totalidad toda la información que los forman.
Al igual que en el caso anterior veíamos las abstracciones que se utilizaban para el almacenamiento de los streams (KStreams y KTables), Spark Streaming introduce su propia abstracción llamada DStreams (Discretized Streams), representados por una serie continua de RDDs (Resilient Distributed Dataset): conjuntos de datos inmutables que son distribuidos por todas las máquinas que formen el clúster de Apache Spark.
Sobre estos streams, Spark puede procesar los datos utilizando una variedad de funciones y algoritmos como reduce, map, union, count, filter, join, window, etc. con la finalidad de transformar o enriquecer la información almacenada.
De manera nativa, Spark Streaming soporta los lenguajes de programación Java, Scala y Python.
Es importante destacar también que Spark Streaming, como parte del framework de Apache Stark, ofrece una integración nativa con una solución de Machine Learning (MLlib), lo que permite que, adicionalmente al tratamiento realizado por los datos, se puedan definir modelos de entrenamiento y aprendizaje que permita aplicar futuros procesamientos o detectar patrones y anomalías.
Conclusiones
Lo cierto es que ambas tecnologías sirven para cubrir prácticamente cualquier caso de uso en el que sea requerido el procesamiento de streams de datos. No obstante, a la hora de seleccionar la tecnologías que más podría encajar con un caso concreto, vale la pena centrarse en tres aspectos fundamentales:
-
Nuestro stack tecnológico actual: si, como parte de nuestro stack, ya contamos con Apache Kafka, parece natural elgir Kafka Streams para el procesamiento de este tipo de información. De manera contraria, es más común elegir Spark Streaming cuando ya contamos con Apache Spark dentro de nuestro stack. En caso de no contar con ninguno de ellos, será necesario, o bien montar un clúster de Kafka para la primera opción o uno de Spark para la segunda. Sea cual sea la opción elegida, ambos deberán de ser integrados con las aplicaciones productoras de la información.
-
Real time: si las necesidades de real time son muy altas y el tiempo de latencia es vital para nuestra solución, la recomendación sería utilizar Kafka Streams, ya que la latencia es de milisegundos, mientras que con Spark Streaming hablaríamos de unos pocos segundos (generalmente, menos de 5 segundos). Esta diferencia se debe, principalmente, a la manera en la que ambos tratan los datos: mientras que Kafka Stream trabaja evento a evento, Spark Streaming lo hace en lotes de datos, lo que hace necesario que sea tratado el lote completo para disponer de los resultados.
-
Machine Learning: Si tenemos la necesidad de integrarnos con alguna solución de Machine Learning, Spark Streaming ya ofrece esta integración de manera nativa. Sin embargo, si optamos por Kafka Stream deberemos buscar e integrar nosotros mismos esta solución.
Como punto final, es importante destacar que, a nivel técnico, Kafka Streams es únicamente una librería, mientras que Spark Streaming esta construido bajo un framework completo. Esto implica que las necesidades de recursos para ambos son diferentes, siendo Kafka Streams una solución mucho más ligera y que, por tanto, requerirá y consumirá menos recursos.
En la siguiente tabla, se hace un resumen de las principales diferencias entre ambas tecnologías:
Kafka Streams | Spark Streaming | |
---|---|---|
Tiempo de respuesta | Milisegundos | Unos pocos segundos |
Lenguajes soportados | Java, Scala | Java, Scala, Python |
Entrada de datos | Kafka | Múltiples opciones soportadas |
Salidad de datos | Múltiples opciones soportadas | Múltiples opciones soportadas |
Consumo de recursos | Librería ligera | Framework completo |
Opciones de escalado | Altamente escalable | Altamente escalable |
Transformación de los datos | Gran variedad de algoritmos y funciones | Gran variedad de algoritmos y funciones |
Machine Learning | Integraciones de terceros | Solución Out of the Box |