Ir al contenido principal

Apache Kafka: una plataforma distribuida para la transmisión de datos

Apache Kafka es una plataforma de transmisión de eventos distribuidos de código abierto utilizada por miles de empresas para canalizaciones de datos de alto rendimiento, análisis de transmisión, integración de datos y aplicaciones de misión crítica.

Permite no solo publicar, almacenar y procesar flujos de eventos de forma inmediata, sino también suscribirse a ellos. Está diseñada para administrar los flujos de datos de varias fuentes y enviarlos a distintos usuarios.

Es una alternativa a RabbitMQ o Apache ActiveMQ.

¿Para qué sirve?

  • Procesamiento de datos en tiempo real: Kafka permite ingerir y procesar flujos continuos de datos, como logs, métricas, eventos de usuarios o transacciones. 
  • Mensajería asíncrona: Actúa como intermediario entre sistemas, permitiendo que productores envíen datos y consumidores los procesen sin necesidad de estar sincronizados. 
  • Integración de sistemas: Conecta aplicaciones y servicios heterogéneos, como bases de datos, sistemas de monitoreo o herramientas de análisis. 
  • Almacenamiento temporal de datos: Los datos se almacenan en tópicos (topics) durante un tiempo configurable, permitiendo a los consumidores leerlos cuando lo necesiten. 
  • Escalabilidad: Soporta grandes volúmenes de datos y puede escalar horizontalmente añadiendo más nodos al clúster. 
  • Tolerancia a fallos: Su arquitectura distribuida asegura que los datos estén replicados y disponibles incluso si algún nodo falla.

Componentes principales:

  • Productores: Envían datos a tópicos. 
  • Consumidores: Leen datos de tópicos. 
  • Tópicos: Categorías donde se almacenan los datos, divididos en particiones para paralelismo. 
  •  Brokers: Servidores que forman el clúster de Kafka y gestionan los datos. 
  •  ZooKeeper: Gestiona la coordinación y configuración del clúster (aunque las versiones más recientes permiten operar sin ZooKeeper usando KRaft).

Casos de uso comunes

  • Análisis en tiempo real: Procesar datos de IoT, como sensores en dispositivos o vehículos. 
  •  Gestión de logs: Recopilar y procesar logs de aplicaciones o servidores (ej. usado con ELK Stack). 
  • Sistemas de recomendación: Enviar eventos de usuarios a motores de recomendación en plataformas como Netflix o Spotify. 
  • Pipelines de datos: Mover datos entre sistemas, como de una base de datos a un data lake o almacén de datos. 
  • Microservicios: Facilitar la comunicación entre microservicios en arquitecturas modernas.

Como vimos con RabbitMQ, se usa en aplicaciones tipo Productor(emisor) - Consumidor(receptor).

Nota curiosa: El nombre viene del escritor Franz Kafka, famoso por escribir La Metamorfosis. De nada.

Instalando Apache Kafka

Es necesario contar con el JDK del 11 al 17 de preferencia. Debemos descargar la última versión de Apache Kafka:

https://kafka.apache.org/downloads

También se puede hacer uso de una imagen de Docker. En este caso nosotros no la ocuparemos.

Instalación en Linux

Una vez descargado debemos descomprimirlo y ubicarnos en el directorio:

$ tar -xzf kafka_2.13-3.9.1.tgz
$ cd kafka_2.13-3.9.1

Inicia ZooKeeper con el script proporcionado:

$ bin/zookeeper-server-start.sh config/zookeeper.properties

Esto inicia ZooKeeper en el puerto predeterminado 2181. Déjalo corriendo en una terminal.

En otra terminal, inicia el servidor de Kafka:

$ bin/kafka-server-start.sh config/server.properties

Esto inicia un broker en el puerto predeterminado 9092. Déjalo corriendo.

Instalación en Windows

Una vez descargado debemos descomprimirlo y ubicarnos en el directorio.

Inicia ZooKeeper con el script proporcionado:

$ bin\windows\zookeeper-server-start.bat config\zookeeper.properties

Esto inicia ZooKeeper en el puerto predeterminado 2181. Déjalo corriendo en una terminal.

En otra terminal, inicia el servidor de Kafka:

$ bin\windows\kafka-server-start.bat config\server.properties

Esto inicia un broker en el puerto predeterminado 9092. Déjalo corriendo.

Probando Apache Kafka

Crea un tópico llamado test-topic para probar:

En Linux:

$ bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1

En Windows:

$ bin\windows\kafka-topics.bat --create --topic test-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1

Ahora probamos. Asegúrate de que los puertos 2181 (ZooKeeper) y 9092 (Kafka) estén libres.

Linux

Productor:

$ bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092

Escribe mensajes (ej. "Hola, Mundo") y presiona Enter.

Consumidor:

$ bin/kafka-console-consumer.sh --topic test-topic --bootstrap-server localhost:9092 --from-beginning

Windows

Productor:

$ bin\windows\kafka-console-producer.bat --topic test-topic --bootstrap-server localhost:9092

Consumidor:

$ bin\windows\kafka-console-consumer.bat --topic test-topic --bootstrap-server localhost:9092 --from-beginning

Para salir presionamos la combinación de teclas Ctrl+C.

Apache Kafka & Python

Crearemos una aplicación productor y un consumidor. Para ello es necesario isntalar esta librería:

$ pip install confluent-kafka

Asegúrate de tener un servidor de Kafka corriendo (puedes usar Docker o una instalación local). Por ejemplo, un broker en localhost:9092. Crea un tópico en Kafka llamado test-topic (puedes usar la herramienta kafka-topics.sh o kafka-topics.bat).

Productor (productor.py) :

from confluent_kafka import Producer

# Configuración del productor
conf = {
    'bootstrap.servers': 'localhost:9092',  # Dirección del broker de Kafka
}

# Crear el productor
producer = Producer(conf)

# Callback para confirmar la entrega del mensaje
def delivery_report(err, msg):
    if err is not None:
        print(f'Error al enviar mensaje: {err}')
    else:
        print(f'Mensaje enviado a {msg.topic()} [{msg.partition()}]')

# Enviar el mensaje "Hola, Mundo"
topic = 'test-topic'
message = 'Hola, Mundo'
producer.produce(topic, value=message, callback=delivery_report)

# Esperar a que los mensajes se envíen
producer.flush()

Consumidor (consumidor.py) :

from confluent_kafka import Consumer, KafkaError

# Configuración del consumidor
conf = {
    'bootstrap.servers': 'localhost:9092',
    'group.id': 'my-group',  # Grupo de consumidores
    'auto.offset.reset': 'earliest'  # Leer desde el inicio del tópico
}

# Crear el consumidor
consumer = Consumer(conf)

# Suscribirse al tópico
topic = 'test-topic'
consumer.subscribe([topic])

# Leer mensajes
try:
    while True:
        msg = consumer.poll(timeout=1.0)  # Esperar 1 segundo por mensajes
        if msg is None:
            continue
        if msg.error():
            if msg.error().code() == KafkaError._PARTITION_EOF:
                print('Fin de la partición')
            else:
                print(f'Error: {msg.error()}')
        else:
            print(f'Mensaje recibido: {msg.value().decode("utf-8")}')
            break  # Salir después de recibir el mensaje
except KeyboardInterrupt:
    pass
finally:
    consumer.close()

Ejecutamos el consumidor:

$ python consumidor.py

Ahora ejecutamos el productor:

$ python productor.py

Salida del productor:

Mensaje enviado a test-topic [0]

Salida del consumidor:

Mensaje recibido: Hola, Mundo

Apache Kafka es ideal para sistemas que necesitan manejar grandes flujos de datos en tiempo real, garantizando escalabilidad, confiabilidad y flexibilidad en la integración de datos.

Enlaces:

https://kafka.apache.org/
https://activemq.apache.org/

Comentarios

Entradas populares de este blog

Programación Windows Batch (CMD) parte 3

Crear ciclos para efectuar operaciones tediosas nos ahorrará tiempo para realizar otras tareas. En está ocasión veremos ciclos con FOR . ¿Cuál es la síntaxis de bucle FOR en Windows Batch? Si está dentro de un archivo *.bat : FOR %%variable IN (seq) DO operaciones Si lo ejecutamos en una terminal: FOR %variable IN (seq) DO operaciones Ejemplo 1 . Recorrer una secuencia de números del 0 al 5: recorrer.bat @ echo off FOR %%i in ( 0 1 2 3 4 5 ) DO echo Hola no. %%i pause Nos imprimirá en pantalla: Hola no. 0 Hola no. 1 Hola no. 2 Hola no. 3 Hola no. 4 Hola no. 5 ¿Puedo usar contadores? Si, se pueden usar. Ejemplo 2 . Uso de contadores: contador.bat @ echo off set numeros = 1 2 3 4 5 6 7 8 9 10 set cont = 0 for %%a in ( %numeros% ) do ( echo Hola no. %%a :: Contador set /a cont+ = 1 ) echo Total: %cont% Este código nos imprimirá, además de los mensajes Hola no. 0 ..., el total de valores conta...

TIOBE index 2024

El índice TIOBE (o índice de la comunidad de programación TIOBE) mide la popularidad de los lenguajes de programación. Su índice no se basa en qué lenguaje de programación es mejor, si tiene mejor perfomance, si posee escalabilidad, si es más sencillo de aprender, de usar, de implementar, etc. Sólo se basa en la popularidad. En el número de referencias ya sea en blogs, foros de consulta, etc. No necesariamente si las empresas lo están usando en alguno de sus desarrollos. Este índice es útil para darse una idea qué lenguaje está cobrando más popularidad y prestigio. Enseguida una tabla con los primeros 5 lenguajes más populares. Índice de Noviembre 2024   Nov 2024  Nov 2023  Change  Programming Language  Ratings  Change  1  1    Python  22.85%  +8.69%  2  3  +  C++  10.64%  +0.29%  3  4  +  Java  9.60%  +1.26%  4 ...

Programación Windows Batch (CMD)

En esta serie de post aprenderemos cómo crear nuestros propios archivos Windows Batch. 1. ¿Por qué aprender Batch en Windows? Una de las razones es que, queramos o no, algún día tendremos que trabajar usando sistemas operativos Windows. Crear scripts nos puede servir para realizar tareas que parecen sencillas en un principio, pero que pueden llegar a ser tediosas (ej. crear múltiples carpetas, comprobar la existencia de un archivo, realizar respaldos, etc.). 2. ¿Cómo puedo crear un archivo Batch en Windows? Los archivos batch en Windows pueden ser escritos con las extensiones *.bat o *.cmd. Pueden contener una serie de comandos y secuencias de instrucciones para realizar diversas tareas. Ejemplo 1. Conocer  el nombre del usuario. usuario.bat @ echo off echo Hola %USERNAME% pause GOTO Comentario -- esto es un comentario multi línea que no se interpretará en MS-DOS -- :Comentario En el anterior ejemplo podemos ver que la variable USERNAME conti...