Empieza a trabajar con Apache Kafka en una máquina virtual (VirtualBox) con Ubuntu y Docker sin perder tiempo

Esta información puede resultar de interés general, pero especialmente a aquellos que, como yo, estáis cursando el Máster en Business Analytics y Big Data UCJC de IMF Business School, en el caso de que no trabajéis habitualmente con Kafka.

Para avanzar con el contenido del Módulo VII (Almacenamiento e Integración de Datos), y tras terminar las prácticas con las bases de datos NoSQL (bases de datos orientadas hacia agregados), debemos abordar la Unidad 7 (Adquisición de datos).

Tal como explica el punto 1 (Instalación) del capítulo 3.4 (Sistemas de mensajería en Apache Kafka), es necesario configurar ZooKeeper y Apache Kafka. Una alternativa al procedimiento descrito en la documentación es descargar una máquina virtual con Ubuntu y Docker, e importarla en Virtual Box. Posteriormente, es fácil y rápido lanzar tantos contenedores como sean necesarios, tanto de Zookeeper, brokers de Apache Kafka configurados en cluster, productores, consumidores o clientes de cualquier tipo.

Yo estoy habituado a crear máquinas virtuales, no tanto a descargarlas, pero para quien quiera practicar con Kafka, sin perder tiempo, os he compartido esta

Máquina virtual (VirtualBox) con Ubuntu 18.10 Cosmic Cuttlefish y Docker 18.06.

que he configurado siguiendo (aproximadamente) estos pasos. Podéis descargarla del drive en el siguiente enlace.

Tras la descarga, los pasos para dejarla completamente up&running son los siguientes:

1. Descomprimir el zip, y situar el archivo en una ruta conocida.

2. En Virtual Box, seleccionar la opción “Máquina – Nueva”, y en el cuadro de diálogo que aparece, poner un nombre a la máquina que vamos a crear y seleccionar el arhivo .vdi del punto 1.

Tras esto, con la opción “Iniciar”, ya se puede arrancar la máquina, tenemos un “Ubuntu 18.10 Cosmic Cuttlefish” levantado, con "Docker 18.06" totalmente operativo. Así de simple y rápido.

Como la máquina está iniciada, ya podemos hacer login. Debemos conocer la contraseña. Están disponibles los siguientes usuarios:

root/osboxes.org
osboxes.org/osboxes.org
tucho/tucho

Este último usuario (tucho/tucho) se puede utilizar también por ssh (puerto 22).

3.) Ahora ya está listo el servidor. Solo resta instalar un cliente ssh en la máquina anfitrión (OJO, o cualquier otra de tu red). Date cuenta que en este momento podrías abandonar tu pesado ordenador y continuar las prácticas de Kafka desde, por ejemplo, un ligerísimo equipo de tipo ChromeBook o incluso desde tu propio smartfone conectado por ssh.

Yo utilizo generalmente el MobaXterm

Configuración MobaXterm Lubuntu por ssh

En esta imagen podemos ver que para crear la sesión de SSH en el MobaXterm hay que introducir la dirección IP de la máquina virtual. Se puede averiguar desde la terminal con la orden ifconfig.

Ahora podemos seguir los ejemplos sin problemas. En vez de arrancar Zookeeper de esta forma:

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

arrancamos zookeeper así:

sudo docker run -d --name zookeeper -p 2181:2181 jplock/zookeeper

En lugar de ejecutar un broker de Kafka de esta forma:

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

para ejecutar un broker de Kafka lo hacemos mediante el comando:

sudo docker run -d --name kafka -p 7203:7203 -p 9092:9092 -e KAFKA_ADVERTISED_HOST_NAME=<IP_ADDRESS> -e ZOOKEEPER_IP=<IP_ADDRESS> ches/kafka

NOTA: IP_ADDRESS es la ip de la máquina virtual (en la que estamos ejecutando los comandos por ssh), sustituir por la tuya.

En este momento ya es posible crear un topico. En vez de:
$sudo bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TOPIC_NAME

Para crear un tópico de Kafka ejecutamos:

sudo docker run --rm ches/kafka kafka-topics.sh --create --topic <TOPIC_NAME> --replication-factor 1 --partitions 1 --zookeeper <IP_ADDRESS>:2181

Si en vez de uno, queremos levantar varios broker de Kafka, debemos cambiar los puertos (puerto del broker propiamente dicho, y puerto JMX) para que no colisionen. Así levantamos 3 broker en cluster:

sudo docker run -d --name kafka1 -p 7204:7204 -p 9093:9093 -e KAFKA_ADVERTISED_HOST_NAME=<IP_ADDRESS> -e KAFKA_JMX_PORT=7204 -e ZOOKEEPER_IP=<IP_ADDRESS> -e KAFKA_BROKER_ID=1 -e KAFKA_PORT=9093 -e KAFKA_ADVERTISED_PORT=9093 ches/kafka

sudo docker run -d --name kafka2 -p 7205:7205 -p 9094:9094 -e KAFKA_ADVERTISED_HOST_NAME=<IP_ADDRESS> -e KAFKA_JMX_PORT=7205 -e ZOOKEEPER_IP=<IP_ADDRESS> -e KAFKA_BROKER_ID=2 -e KAFKA_PORT=9094 -e KAFKA_ADVERTISED_PORT=9094 ches/kafka

sudo docker run -d --name kafka3 -p 7206:7206 -p 9095:9095 -e KAFKA_ADVERTISED_HOST_NAME=<IP_ADDRESS> -e KAFKA_JMX_PORT=7206 -e ZOOKEEPER_IP=<IP_ADDRESS> -e KAFKA_BROKER_ID=3 -e KAFKA_PORT=9095 -e KAFKA_ADVERTISED_PORT=9095 ches/kafka

Mediante los siguientes comandos podemos ejecutar tres productores (console producer) enviando mensajes al mismo tópico, pero cada uno a través de un broker diferente (los tres broker que hemos levantado en el paso anterior):
sudo docker run --rm --interactive ches/kafka kafka-console-producer.sh --topic TOPIC_NAME --broker-list <IP_ADDRESS>:9093

sudo docker run --rm --interactive ches/kafka kafka-console-producer.sh --topic TOPIC_NAME --broker-list <IP_ADDRESS>:9094

sudo docker run --rm --interactive ches/kafka kafka-console-producer.sh --topic TOPIC_NAME --broker-list <IP_ADDRESS>:9095

Y finalmente podemos verificar que todos los mensajes son recibidos en la misma terminal, donde ejecutamos un único consumidor (console consumer), mediante el siguiente comando:

sudo docker run --rm ches/kafka kafka-console-consumer.sh --topic toprueba --from-beginning --zookeeper <IP_ADDRESS>:2181

Si tienes alguna duda, no dudes en ponerte en contacto, intentaré resolvértela via mail en cuanto tenga tiempo, o en el peor de los casos, si se pone difícil, podría echarte una mano vía TeamViewer.

Espero que pueda servir de ayuda a alguien. Sobre esta máquina voy a completar mis prácticas de Kafka. Suerte con las tuyas.

Alberto Morales Morales

Software craftsman. Passion for developing quality code that can be proud of. Happily married.

Madrid, Spain.