Stream processing – Tecnologías y comparativa

Última actualización: 12/10/2020

En esta entrada exploramos las tecnologías open source más populares de stream processing y las comparamos analizando sus características, ventajas y desventajas.

¿Qué es el Stream Processing?

El stream processing está basado en la idea de procesar los datos de forma continua. En cuanto estos datos están disponibles se procesan de manera secuencial. Para ello, se usan flujos de datos infinitos y sin límites de tiempo. La manera tradicional de procesar los datos ha sido en batches, agrupados en grandes lotes, esta técnica se llama batch processing.

Actualmente, los servicios en tiempo real que usan estos mecanismos de stream processing cada vez tienen más demanda. A través de estas técnicas es posible acelerar la velocidad a la que se obtiene valor de los datos y generar acciones para interaccionar con los clientes con poca latencia.

Generalmente, las latencias que se consideran al hablar de los sistemas de tiempo real o de stream processing son del orden de 10 milisegundos a 1 segundo. En función del caso de uso o el ámbito de su aplicación, estas latencias pueden reducirse, aunque supondrán importantes desafíos.

Los requisitos más importantes a tener en cuenta a la hora de implementar una solución analítica en streaming son los siguientes:

  • Cantidad de datos que se deben procesar de forma simultánea (picos de carga)
  • Latencias extremo a extremo (end to end)
  • Garantías de entrega de mensajes que debe asegurar la solución

Entre los casos de uso más comunes se encuentra la monitorización de sistemas, de redes y de aplicaciones, dispositivos Internet of Things (IoT), sistemas de recomendación y optimización de resultados. Además, permiten generar notificaciones en dispositivos y aplicaciones móviles en tiempo real.

Conceptos Básicos en Stream Processing

A continuación vamos a desarrollar algunos conceptos y términos básicos que se han generado alrededor de las tecnologías de stream processing.

Los sistemas de streaming distribuidos tienen tres maneras de gestionar las garantías de entrega de los mensajes:

  • At-least-once: Garantiza que el mensaje siempre se entregará. Es posible que en caso de fallo se entregue varias veces, pero no se perderá ningún mensaje en el sistema.
  • At-most-once: Garantiza que el mensaje se entregará una vez o no se entregará. Un mensaje nunca se entregará más de una vez.
  • Exactly-once: Garantiza que todos los mensajes se van a entregar exactamente una vez, realizando el sistema las comprobaciones necesarias para que esto suceda.

Existen numerosas aplicaciones que no se pueden permitir la existencia mensajes duplicados o perdidos debido a fallos en la comunicación o en las aplicaciones. Por esta razón es tan importante que existan sistemas que garanticen la entrega exactamente una vez como Apache Kafka o Flink.

Tupla: conjunto de elementos o de tipos de datos simples guardados de forma consecutiva.

Flujo de datos: secuencia infinita de tuplas.

Ventanas de procesamiento: Dividen los datos de entrada en partes finitas. Permiten tratar las secuencias infinitas con unos recursos limitados como la memoria del sistema. Pueden estar basadas en tiempo o en el número de elementos y se pueden desplazar a medida que se procesa su contenido. Existen varios tipos de ventanas dependiendo de las características del sistema.

Operaciones con y sin estado: Las operaciones sin estado permiten obtener un resultado por cada uno de los eventos procesados. Las operaciones con estado operan sobre un conjunto de elementos para generar una salida.

Para mantener la tolerancia a fallos, los sistemas de streaming usan checkpointing. De esta manera, almacenan de forma persistente el estado del sistema en instantes de tiempo y el punto en el que se encuentran para poder recuperar la información en el caso de que ocurra algún fallo de red o en los propios nodos.

Tecnologías de Stream Processing

En la actualidad existen varias tecnologías y frameworks open source de stream processing, todas ellas son de reciente creación, desarrolladas en los últimos años. Hemos dejado fuera de esta lista a Apache Storm debido a que otras tecnologías han tomado la delantera en cuanto a capacidades y el proyecto está en desuso. A continuación, comentaremos los aspectos más importantes de las más populares.

 Spark StreamingKafka StreamsFlink
DespliegueStandalone, Yarn, MesosLibrería (API Java)Standalone, Yarn, Mesos, Kubernetes
GarantíasExactly-onceExactly-onceExactly-once
ConectoresMúltiplesDependiente de conectores de KafkaMúltiples
Gestión estadoNoSi (RocksDB)Si (RocksDB)
AbstraccionesTablas, SQL, MLTablas, SQL (KSQL)Tablas, SQL, CEP, ML
Retraso eventosSiSiSi
ModeloMicro-batchStreaming de eventos individualesStreaming de eventos individuales
BatchSiNoSi
ComunidadGran comunidad, aunque más pequeña en streamingMás reciente, en crecimientoMás pequeña pero en rápido crecimiento
Casos de usoStreams ETLMicroservicios, dentro de otras aplicacionesTodos

En la siguiente gráfica podemos ver la tendencia desde el año 2013 en las búsquedas de Google de las tres tecnologías de streaming más populares.

Tendencia herramientas Stream Processing
Tendencia herramientas Stream Processing

Kafka Streams

Kafka Streams es una librería (API) que permite construir aplicaciones de procesamiento de flujos de datos usando Apache Kafka como sistema de almacenamiento de entrada y de salida de datos. La versión inicial se publicó en enero del 2011.

Aunque Kafka Streams depende de Apache Kafka puede conectarse a sistemas externos y numerosas tecnologías para construir flujos de datos en tiempo real desacoplando aplicaciones y facilitando la implementación de microservicios.

Ventajas

Apache Kafka Logo - Stream processing
  • No necesita un clúster dedicado (usa Kafka)
  • APIs de consumidores y productores de mensajes
  • Reprocesamiento sencillo de mensajes
  • Desacoplamiento de aplicaciones, muy usado en microservicios
  • Puede usarse como base de datos
  • Procesamiento de eventos individuales, streams nativos
  • Garantías de entrega exactly-once

Desventajas

  • Acoplado con Apache Kafka
  • No tiene mucha adopción para cargas de trabajo pesadas

Spark Streaming

Spark Streaming extiende la funcionalidad de Apache Spark para realizar stream processing. Para ello, agrupa los datos recibidos en pequeños micro-batches e incluye operadores con y sin estado. La versión inicial se publicó en mayo de 2014.

Ventajas

Apache Spark Streaming logo
  • Facilidad de uso: APIs de alto nivel conocidas y bien mantenidas en la comunidad, con gran cantidad de documentación
  • Librerías extensas para grafos y machine learning
  • Lenguajes de programación Scala, Java y Python
  • Incluye una CLI (Interfaz de línea de comandos) en Scala y Python
  • Checkpointing sencillo gracias a micro-batches
  • Mayor throughput debido a la gestión en micro-batches
  • Soporta una arquitectura lambda
  • Garantías de entrega exactly-once

Desventajas

  • Mayores latencias de procesamiento a causa de micro-batches
  • Parametrización compleja y ajustes manuales
  • Solo soporta ventanas basadas en tiempo

Apache Flink

Apache Flink es una plataforma distribuida de stream processing con alta disponibilidad y escalabilidad. Aunque puede realizar procesamiento batch y streaming, ha sido diseñado con una arquitectura orientada al procesamiento de eventos en streaming individuales. La versión inicial se publicó en mayo del 2011.

Ventajas

Apache Flink Logo - Stream processing
  • Procesamiento de eventos individuales, streams nativos
  • Velocidad, baja latencia y throughput configurables
  • Ventanas de procesamiento personalizadas basadas en eventos o en tiempo
  • Garantías de entrega exactly-once

Desventajas

  • Comunidad más pequeña pero en crecimiento
  • La adopción para procesamiento batch es baja

Conclusiones

Para elegir un buen sistema de procesamiento en streaming debemos tener muy en cuenta el caso de uso y sus particularidades. Kafka Streams es el sistema más ligero, que puede soportar fácilmente aplicaciones sencillas. Sin embargo, para desarrollar aplicaciones más complejas y pesadas, Flink o Spark son una mejor opción.

Además del caso de uso actual, también debemos considerar la extensión de éstos en el futuro y las nuevas aplicaciones que desarrollemos, de forma que podamos reutilizar el mismo sistema. En el caso de Kafka, si tenemos un clúster de Kafka ya desplegado para otro propósito, debemos estudiar si merece la pena ampliar su uso con Kafka Streams o bien desplegar un nuevo clúster de Flink.

En la actualidad, Apache Flink es un sistema más flexible que Apache Spark. También puede suponer menores latencias y procesamientos más rápidos debido a su arquitectura. Sin embargo, el campo del stream processing avanza muy rápido, y es posible que las tecnologías evolucionen o surjan alternativas interesantes. Debemos conocer estas opciones para ser capaces de tomar la mejor decisión.

Como resumen:

Si ya estás usando Apache Spark en tu organización, no necesitas baja latencia, quieres unificar procesos batch y stream y deseas un alto throughput la mejor opción es Spark Streaming.

En el caso de que solo necesites microservicios y Kafka con baja latencia, usa Kafka Streams.

Si necesitas un sistema flexible, con baja latencia y características de procesamiento en streaming avanzado decídete por desplegar Flink.

Formación: Libros y Cursos

Si quieres aprender más sobre estas tecnologías, no dudes en invertir en tu formación. A continuación tienes unos enlaces a libros y cursos recomendados:

Libros:

Cursos:

Preguntas Frecuentes Stream Processing – FAQ

¿Cuál es la diferencia entre batch y stream processing?

El procesamiento Batch está orientado a procesar agrupaciones grande de datos con un tamaño finito y determinado. El procesamiento streaming maneja registros individuales o micro batches con flujos de datos infinitos.

¿Qué es procesamiento en tiempo real?

El procesamiento en tiempo real proporciona resultados a medida que entran eventos en el sistema. Para ello, realiza las operaciones en el momento.

¿Es Flink más rápido que Spark Streaming?

Apache Flink puede procesar datos más rápido que Spark Streaming debido a su arquitectura orientada a eventos. En el caso de Spark Streaming se procesan micro-batches, lo que aumenta las latencias y el posible throughput.


A continuación, el vídeo-resumen. ¡No te lo pierdas!


¡Echa un ojo a mi lista de reproducción de Big Data en Youtube!

Si te ayuda el contenido del blog, por favor considera unirte a la lista de correo para reconocer el trabajo!

Deja una respuesta