KSQL es una funcionalidad que Confluent añade sobre Apache Kafka manteniendo su carácter de open source. Básicamente permite transformar los streams de datos de manera continua, tomando los topics, los filtra, procesa y “reacciona” a los mismos creando nuevos tópicos derivados de los originales.

Por ejemplo, una empresa de asistencia en carretera, podría tener un topic donde se recogen los eventos correspondientes a los cambios de posición de las grúas cada ciertos segundos. Si en el contenido del evento hay un atributo de “en servicio”, es decir, cuando está transportando un coche, podríamos hacer fácilmente un nuevo topic que sea “grúas en servicio” mediante KSQL.

KSQL no interactúa directamente con los topics, introduce una abstracción en medio para procesar los datos: streams y tables. ¿Pero que son los Streams y las tablas (tables) y qué diferencia hay entre ellos?

Stream

“Un stream en Kafka registra toda la historia de eventos del mundo (o del negocio) desde el principio de los tiempos hasta ahora mismo. Representa el pasado y el presente. Según vamos desde hoy al mañana, los nuevos eventos son añadidos de manera constante a esta historia. La historia es una secuencia o cadena de eventos, por lo que tú sabes qué evento ocurrió antes de otro evento.”

Los Streams representan datos en movimiento, capturando los eventos que ocurren en el mundo.

Características:

  • Unbounded
    Almacena un flujo continuo e infinito por lo que los streams son unbounded
  • Inmutable
    Cualquier nuevo dato que venga se añade al stream actual y no modifica nada de lo existente

Table

“Una tabla en Kafka es el estado del mundo hora. Representa el presente. Es un agregación de la historia de eventos del mundo, y esa agregación cambia constantemente según vamos del hoy al mañana.”

Representa una vista materializada de un stream con el último valor de la  clave. Tienen las siguientes características:

  • Bounded
    representa una foto del stream actual por lo que tiene límites definidos
  • Mutable
    Cualquier nuevo dato se añade a la tabla y si existe un registro anterior con la misma clave se machaca
  • Las tablas representan un registro en Kafka por lo que son de la forma clave, valor

Se puede considerar al stream como el changelog de la tabla, como la agregación de las actualizaciones en el stream en el tiempo que se reflejan en la tabla

A la tabla, se considera un snapshot, en un momento del tiempo, del último valor de cada clave en el stream. La observación de la tabla a lo largo del tiempo produce el stream

Aquí vemos una representación del stream y de la tabla a lo largo del tiempo en el caso de transferencias bancarias entre Alice y Bob.

I 
11 BOB S50 ALICE 
111 BOB $ 一 00 ALICE 
ALICE S100 to BOB 
Transactions 
ALICE 
ALICE 
ALICE 
ALICE 
User 
User 
Table 
Balance 
Balance 
Balance 
Balance 
ALICE S100 to BOB 
BOB S50 to ALICE 
BOB S50 to ALICE 
Stream

Extensión de KSQL

KSQL al igual que su lenguaje “padre”, el SQL, tiene incorporadas de fábrica varias funciones como Substring o Count. Pero además de las funciones predefinidas, en caso necesario, nosotros podemos programar nuestras propias funciones para procesar nuestros streams de datos.

KSQL tiene un API para hacer estas funciones personalizadas: user-defined scalar functions (UDF) y use-defined aggregate functions (UDAF)

Esta extensión se hace en Java, básicamente cumpliendo estos tres pasos:

  1. Import io.confluent.ksql.function.udf.Udf and io.confluent.ksql.function.udf.Udf
  2. @UDFDescription: anotación que describe el nombre y la funcionalidad de la función
  3. @UDF: anotación del método que implementa la funcionalidad del método que procesa los eventos

Una vez implementada, es necesario generar un JAR con el código y desplegarlo en el servidor de KSQL. El resto de usuarios pueden usar esta nueva función sin saber programar.

Más información

https://docs.confluent.io/current/streams/concepts.html