Introducción a Kafka Streams y KSQL

Última actualización: 20/07/2020

En este artículo de introducción aprendemos qué es Kafka Streams y KSQL: cómo usar este motor de streaming para Apache Kafka.

Kafka Streams y KSQL

Cada vez es más común el uso del ecosistema de Apache Kafka para implementar aplicaciones en sistemas escalables de tiempo real. Este tipo de aplicaciones permiten acelerar la extracción de valor de los datos en multitud de sectores como telecomunicaciones, internet e industria.

Además, está profundamente relacionado con la infraestructura híbrida y cloud que están adoptando todas estas empresas. Es una de las plataformas que habilitan el movimiento de datos entre sistemas on-premises y cloud y que puede actuar como un clúster de agregación de eventos.

Casos de uso

Además de sistema de procesamiento y de distribución de datos, los casos de uso para este tipo de soluciones con Apache Kafka se centran en su uso como una plataforma central de streaming de eventos. En este caso, Kafka actúa como middleware.

También se presenta como la plataforma de integración de sistemas en todos los niveles y de movimiento de datos: entre clústers, servicios, zonas, partners externos, aplicaciones legacy y modernas, etc.

Otro caso de uso muy extendido es el de la monitorización. Entre los tipos de monitorización en tiempo real se encuentra la monitorización de hardware, de seguridad y de servicios. Este uso permite también la implementación de alertas y actuaciones rápidas ante las anomalías detectadas.

¿Qué es Kafka Streams?

Kafka Streams es una librería open source que permite construir aplicaciones de procesamiento de flujos de datos usando Apache Kafka como sistema de almacenamiento de entrada y de salida de datos. Es posible escribir las aplicaciones en los lenguajes de programación Java y Scala. Aún no está disponible la API de Kafka Streams para Python.

El llamado procesamiento en streaming consiste en procesar los datos de forma continua, tan pronto como están disponible para su análisis. Se procesa de manera secuencial sobre flujos de datos sin límites temporales. Esto ocurre en Kafka Streams y KSQL.

Para crear una aplicación Kafka Streams necesitaremos un clúster de Apache Kafka e insertar en un topic los datos que procesaremos con la aplicación. Para implementar una aplicación sencilla podemos importar la librería de Kafka Streams con maven en nuestro proyecto.

A continuación se muestra un ejemplo de aplicación Kafka Streams escrito en Java que realiza los siguientes pasos:

  1. Lee un flujo de números de un topic de Apache Kafka representados con un string y almacenados todos con la misma clave. (línea 4)
  2. Se define una ventana de tipo Tumbling de 20 segundos. (línea 6)
  3. Suma los números según se van procesando. (línea 7)
  4. Imprime los resultados por consola. (línea 9)
static String TOPIC = "TopicName";
final StreamsBuilder builder = new StreamsBuilder();
builder
 .stream(TOPIC, Consumed.with(Serdes.String(), Serdes.String()))
 .groupByKey()
 .windowedBy(TimeWindows.of(Duration.ofSeconds(20)))
 .reduce((value1, value2) -> value1 + value2)
 .toStream()
 .print(Printed.toSysOut());

Topology topology = builder.build();
final KafkaStreams streams = new KafkaStreams(topology, props); 
streams.start();

¿Qué es KSQL?

KSQL permite desarrollar aplicaciones de streaming sobre un sistema escalable, elástico y tolerante a fallos. Proporciona una interfaz SQL para procesamiento de flujos de datos con operaciones de filtrado, transformación, agregación y con posibilidad de usar ventanas de procesamiento. Está desarrollado por Confluent y distribuido con licencia open source.

KSQL proporciona bajas latencias, del orden de milisegundos y permite guardar el estado del sistema. Es una abstracción sobre la API de Kafka Streams que consume datos estructurados como AVRO o JSON de los topics de Kafka.

Debemos diferenciar entre KStream y KTable. Un Stream (KStream) es una secuencia de datos estructurados. Cuando un evento se añade al Stream no puede ser modificado o eliminado. Una Tabla (KTable) es mutable, y representa una situación concreta basada en el Stream de datos.

Podemos crear un Stream con el siguiente comando desde la CLI:

ksql> CREATE STREAM users_original (id bigint, user varchar) WITH (kafka_topic='users', value_format='DELIMITED'); 

También podemos crear una tabla de la siguiente forma:

ksql> CREATE TABLE users_original (registertime bigint, gender varchar, regionid varchar, userid varchar) WITH (kafka_topic='users', value_format='JSON');

Kafka Streams vs Apache Flink

Ambos frameworks de procesamiento son muy populares en la actualidad. Las dos tecnologías son open source y se presentan como las mejores alternativas a Apache Spark Streaming para evitar los micro-batches y las latencias asociadas.

Apache Flink Logo

Hay que tener en cuenta que Kafka Streams (KStream) y KSQL es una API con Kafka, mientras que Apache Flink es un software completo construido desde cero como sistema de streaming de datos como objetivo. En concreto, el uso de Kafka Streams está totalmente acoplado a Kafka aunque pueda conectarse con sistemas externos. Flink también contiene integraciones (Sources y Sinks) con múltiples tecnologías y actualmente su API es más completa.

Hay que tener en cuenta que, en Kafka, si se cambia una clave, se imita el shuffle sort creando un nuevo topic, lo que disminuye el rendimiento respecto a tecnologías como Flink. Tampoco tiene checkpointing, por lo que si se caen todos los brokers puede tardar horas en recuperarse.


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