Kafka Streams

Publicado por

Índice

  1. Introducción
  2. ¿Qué es kafka Streams?
  3. Conceptos de Streams
  4. Arquitectura

1. Introducción

Si estás trabajando con grandes cantidades de datos, posiblemente hayas oído hablar de Kafka, a alto nivel, es un sistema distribuido de mensajería de suscripción-publicación tolerante a fallos diseñado para procesar datos rápidamente y que tiene la capacidad de manejar cientos de miles de mensajes.

El procesamiento de Streams es el procesamiento en tiempo real de los datos de forma continua, concurrente y en forma de registro a registro.

Kafka se puede utilizar de muchas formas, una de ellas es el procesamiento en tiempo real. Un ejemplo podría ser leer información de un topic, realizar una serie de transformaciones sobre el registro y después escribirlo en otro topic, actualmente para realizar esta tarea se pueden utilizar dos métodos:

  • Escribir código para implementar un consumidor que lea los datos y después los escriba con un productor
  • Utilizar algún framework como Spark Streaming, Flink o Storm

2. ¿Qué es Kafka Streams?

Es una librería para construir aplicaciones en streaming, más específicamente aplicaciones que transforman datos de un topic (input) y lo escriben en otro (output).

streams-introduction-your-app

Img 1: Kafka Streams API by Confluent.io

KSQL es un motor de streaming que utiliza Kafka para realizar las tareas de procesamiento de streams utilizando sentencias SQL

3. Conceptos de Streams

Stream

Representa un conjunto de datos ilimitado, que se actualiza continuamente, donde ilimitado significa “de tamaño desconocido o sin límite de tamaño”. Al igual que un topic en Kafka, un stream consiste en una o más particiones stream.

Una partición stream es una secuencia ordenada, reproducible y tolerante a fallos, de registros de datos inmutables, donde un registro de datos se define como un par clave-valor.

Aplicación de procesamiento de Streams

Es un programa que hace uso de la librería de Kafka Streams y que define la lógica computacional a través de una o mas topologías de procesamiento. Las aplicaciones de procesamiento de streams no corren en los brokers, en vez de ello, corren en JVM separadas.

Una instancia es cualquier copia de la aplicación en ejecución, son el primer paso para que el sistema pueda escalar y paralelizar el procesamiento, también contribuyen a que la aplicación sea tolerante a fallos.

scale-out-streams-app

Img 2: Kafka application instances

Topología de procesador

Una topología de procesador define la lógica computacional del procesamiento de datos que necesita ser realizado por la aplicación de streams. Una topología es un grafo en el que los nodos son los Stream Processors que están conectado por los streams representados por líneas.

streams-concepts-topology

Img 3: Representación de una tipología de procesamiento

Stream Processor

Es representado por los nodos en los grafos de tipología de procesador. Representa un paso de procesamiento en la topología, normalmente utilizado para transformar los datos. Las operaciones más típicas son map o filter, tambien joins y agregaciones. Un stream processor recibe un registro en un momento del tiempo por el elemento anterior en el grafo, aplica la operación definida sobre el registro y produce uno o mas registros como salida que es enviado al siguiente elemento del grafo.

Con Kafka Streams podemos utilizar dos APIs para definir los stream processors:

  1. La declarativa, utilizando la API funcional DSL, que es la recomendada para la mayoría de usuarios porque muchos de los casos de procesamiento de datos se pueden expresar con una pocas líneas de código DSL (map o filter)
  2. La imperativa, la API de bajo nivel Processor, proporciona más flexibilidad que el DSL, pero requiere mayor trabajo en el código.

Stateful Stream Proccesing

Hay muchas aplicaciones que no requieren estado, lo que las convierte en Stateless, que significa que el procesamiento de un mensaje es independiente del procesamiento de otros mensajes. Un ejemplo sería cuando solo quieres transformar un mensaje en un momento del tiempo, o quieres filtrarlo basado en una condición.

En la práctica muchas aplicaciones requieren de un estado, lo que las conviertes en Stateful, para su correcto funcionamiento hay que guardar el estado y este debe ser tolerante a fallos. Las operaciones con estado son: join, aggregate, window, etc.

4. Arquitectura

Uno de los requisitos de esta tecnología es que pueda escalar horizontalmente, esto se consigue gracias a la capacidad de paralelizar la ejecución de tareas en diferentes máquinas.

Particiones y tareas

Kafka Streams utiliza los conceptos de particiones de streams y tareas de streams como unidades lógicas en su modelo de paralelismo. Existen vínculos estrechos entre Kafka Streams y Kafka en el contexto del paralelismo:

  • Cada partición de Streams es una secuencia totalmente ordenada de registros de datos que se asignan a una partición de un topic Kafka
  • Un registro de datos en el stream se mapea a un mensaje Kafka de ese topic
  • La key determina la partición donde van los datos, tanto para topics como para streams

Una topología de procesador de aplicación escala dividendo el input en múltiples tareas de streams. Más específicamente, Kafka Streams crea un número fijo de tareas en función de las particiones del stream de entrada, a cada tarea se le asigna un conjunto de particiones del input stream. La asignación de las particiones a las tareas del stream nunca cambia, por lo tanto la tarea de streams es una unidad fija de paralelismo de la aplicación.

Las tareas pueden crear instancias de su propia topología en función de las particiones asignadas. También mantiene un búfer para cada una de las particiones asignadas y procesa los datos de entrada uno a uno del bufer. Como resultado las tareas de stream se pueden procesar de forma independiente y en paralelo sin intervención manual.

Simplificando un poco, el máximo paralelismo que una aplicación puede tener está determinado por el numero máximo de tareas de stream, que a su vez viene determinado por el número máximo de particiones del topic del que se lea. Por ejemplo si el topic tiene 5 particiones, entonces puedes correr 5 instancias de aplicación.  Estas instancias van a colaborar para procesar los datos del topic, si corres más instancias que particiones, las instancias restantes estarán en idle hasta que alguna de las instancias en ejecución se caiga.

Es importante reseñar que Kafka Streams no es un planificador de recursos, pero si que es una librería que “corre” en cualquier máquina con JVM. Múltiples instancias de aplicación son lanzadas en la misma máquina, o distribuidos sobre múltiples máquinas y las tareas si que son distribuidas automáticamente por la librería sobre las instancias de aplicación en ejecución. Las asignación de particiones nunca cambia, si una instancia de aplicación falla, todas sus tareas son reiniciadas en otra instancia de aplicación y continua consumiendo desde la misma partición de streams.

Modelo de hilos

Kafka Streams permite al usuario configurar el número de hilos que una librería puede utilizar para paralelizar el procesamiento dentro de una instancia de aplicación. Cada hilo puede ejecutar una o más tareas de streams de su topología de procesador de forma independiente.

streams-architecture-threads

Img 4: Un hilo stream corriendo dos tareas stream

Iniciar mas hilos de streams o más instancias de aplicación equivale a replicar la topología y hacer que se procese un subconjunto diferente de particiones, paralelizando el procesamiento. Vale la pena señalar que no hay un estado compartido entre los subprocesos/hilos por lo que no es necesaria la coordinación entre ellos. Esto hace que sea muy sencillo ejecutar topologías en paralelo a través de instancia o subprocesos. La asignación de las particiones del topic a los distintos subprocesos lo maneja de forma transparente Kafka Streams, aprovechando la funcionalidad de coordinación del lado del servidor de kafka.

Estado

Kafka Streams proporciona lo que son llamados “Almacenes de estado”, las aplicaciones utilizan estos almacenes para guardar y consultar datos, que es una característica importante cuando se realizan operaciones con estado Stateful. El DSL de Kafka Streams, por ejemplo, automáticamente crea y maneja almacenes de estado cuando se llama a la operación count() o aggregate(), o cuando se realiza una ventana sobre un stream.

Cada tarea en una aplicación Kafka Stream puede tener uno o más almacenes de esado locales a los que se puede acceder a través de una API, necesarios para almacenar y consultar datos durante el procesamiento. Estos almacenes pueden ser una base de datos RocksDB, o un hashmap en memoria, etc. Kafka Streams ofrece tolerancia a fallos y recuperación automática de errores para los almacenes de estado locales.

Una aplicación Kafka Streams se ejecuta normalmente en múltitud de instancias de aplicación, como los datos se particionan para procesarlosm el estado completo de una aplicación se distribuye en todos los almacenes de estado locales de las instancias en ejecucción. La API de Kafka Streams permite trabajar con los almacenes de estado de una aplicación tanto a nivel local como en su totalidad.

 

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s