El software de código abierto Apache Kafka es una de las mejores so­lu­cio­nes para almacenar y procesar flujos de datos. Esta pla­ta­fo­r­ma de me­n­sa­je­ría y tra­n­s­mi­sión, publicada bajo la licencia de Apache 2.0, destaca por su to­le­ra­n­cia a los errores, su excelente es­ca­la­bi­li­dad y su gran velocidad de lectura y escritura. Estas ca­ra­c­te­rí­s­ti­cas, que resultan sumamente in­te­re­sa­n­tes para las apli­ca­cio­nes de big data, se basan en una red de or­de­na­do­res (de­no­mi­na­da clúster) que hace posible almacenar y replicar datos de manera di­s­tri­bui­da. La co­mu­ni­ca­ción con el clúster se establece a través de cuatro in­te­r­fa­ces distintas, siendo su­fi­cie­n­te un simple protocolo TCP.

Con este tutorial de Kafka, apre­n­de­rás las funciones más básicas de esta apli­ca­ción escrita en Scala, empezando por la in­s­ta­la­ción de Kafka y de otro software necesario para uti­li­zar­la: Apache ZooKeeper.

Re­qui­si­tos para utilizar Apache Kafka

Para poder ejecutar el potente clúster de Kafka, se necesita un hardware adecuado. El equipo de de­sa­rro­lla­do­res del programa re­co­mie­n­da utilizar pro­ce­sa­do­res Intel Xeon de cuatro núcleos con memoria de 24 gigabytes. En principio, ne­ce­si­ta­rás su­fi­cie­n­te memoria para poder almacenar en todo momento en caché los accesos de lectura y escritura de todas las apli­ca­cio­nes que accedan ac­ti­va­me­n­te al clúster. Dado que el alto re­n­di­mie­n­to de los datos es una de las ventajas pa­r­ti­cu­la­res de Apache Kafka, es de vital im­po­r­ta­n­cia elegir unas unidades de disco duro apro­pia­das. Apache Software Fou­n­da­tion re­co­mie­n­da las unidades de disco duro SATA (8 x 7200 RPM). Para evitar cuellos de botella en el re­n­di­mie­n­to, el principio general es que cuantas más unidades haya, mejor.

También en términos de software, se deben cumplir algunos re­qui­si­tos para poder utilizar Apache Kafka para gestionar flujos de datos entrantes y salientes. Por ejemplo, cuando elijas el sistema operativo, deberías de­ca­n­tar­te por un sistema UNIX como Solaris o una di­s­tri­bu­ción de Linux, ya que la co­m­pa­ti­bi­li­dad con las pla­ta­fo­r­mas de Windows es limitada. Dado que Apache Kafka está escrito en lenguaje Scala, compilado en Java, conviene que tengas instalada una versión ac­tua­li­za­da del Java De­ve­lo­p­me­nt Kit (JDK) en tu sistema. Lo mismo se aplica, entre otros, al Java Runtime En­vi­ro­n­me­nt, necesario para ejecutar apli­ca­cio­nes Java. Otro co­m­po­ne­n­te obli­ga­to­rio es el servicio Apache ZooKeeper, que permite la si­n­cro­ni­za­ción de procesos en sistemas di­s­tri­bui­dos.

gZj16chk0Ss.jpg Para mostrar este video, se requieren cookies de terceros. Puede acceder y cambiar sus ajustes de cookies aquí.

Apache Kafka: tutorial para instalar Kafka, ZooKeeper y Java

En el anterior apartado de este tutorial de Kafka, ex­pli­ca­mos los co­m­po­ne­n­tes de software ne­ce­sa­rios para uti­li­zar­lo. A menos que ya lo tengas co­n­fi­gu­ra­do en tu sistema, lo mejor es comenzar in­s­ta­la­n­do Java Runtime En­vi­ro­n­me­nt. Muchas versiones recientes de las di­s­tri­bu­cio­nes de Linux, como Ubuntu, el sistema operativo que nos sirve de ejemplo en este tutorial de Apache Kafka (versión 17.10), ya incluyen una im­ple­me­n­ta­ción gratuita del JDK (Java De­ve­lo­m­pe­nt Kit) en su re­po­si­to­rio de paquetes oficial, llamada OpenJDK. Para instalar fá­ci­l­me­n­te el kit de Java a través de esta im­ple­me­n­ta­ción, introduce el siguiente comando en el terminal:

sudo apt-get install openjdk-8-jdk

Una vez hayas instalado Java, haz lo mismo con el servicio de si­n­cro­ni­za­ción de procesos Apache ZooKeeper. El di­re­c­to­rio de paquetes de Ubuntu también contiene un paquete listo para utilizar en este caso, que se ejecuta con el siguiente comando:

sudo apt-get install zookeeperd

Con este otro comando, puedes verificar si el servicio de ZooKeeper está activo:

sudo systemctl status zookeeper

Si Apache ZooKeeper se está eje­cu­ta­n­do, tendrías que ver algo así:

Si el servicio de si­n­cro­ni­za­ción no se está eje­cu­ta­n­do, puedes iniciarlo en cualquier momento con este comando:

sudo systemctl start zookeeper

A co­n­ti­nua­ción, para ase­gu­rar­te de que ZooKeeper se ejecute au­to­má­ti­ca­me­n­te cada vez que inicies el sistema, introduce un comando de inicio au­to­má­ti­co:

sudo systemctl enable zookeeper

Fi­na­l­me­n­te, tendrás que crear un perfil de usuario de Kafka para volver a utilizar el servidor más adelante. Para ello, vuelve a abrir el terminal y escribe el siguiente comando:

sudo useradd kafka -m

Mediante el ad­mi­ni­s­tra­dor de co­n­tra­se­ñas passwd, puedes asignar al usuario la co­n­tra­se­ña que desees, es­cri­bie­n­do primero el comando y luego la co­n­tra­se­ña:

sudo passwd kafka

En el siguiente paso, le co­n­ce­de­rás derechos sudo al usuario «kafka»:

sudo adduser kafka sudo

Con el perfil de usuario que acabas de crear, puedes iniciar sesión en cualquier momento:

su – kafka

Llegados a este punto del tutorial, ya podemos descargar e instalar Kafka. Existen muchas fuentes de descarga fiables que ofrecen versiones actuales y an­te­rio­res de este software de pro­ce­sa­mie­n­to de flujos. Por ejemplo, puedes obtener los archivos de in­s­ta­la­ción de primera mano en el di­re­c­to­rio de descargas de Apache Software Fou­n­da­tion. Te re­co­me­n­da­mos disponer de una versión ac­tua­li­za­da de Kafka, por lo que, al escribir el siguiente comando en el terminal, quizás tengas que adaptarlo a la nueva versión:

wget http://www.apache.org/dist/kafka/2.1.0/kafka_2.12-2.1.0.tgz

El siguiente paso es de­s­co­m­pri­mir el archivo co­m­pri­mi­do que te has de­s­ca­r­ga­do:

sudo tar xvzf kafka_2.12-2.1.0.tgz --strip 1

Utiliza el parámetro «--strip 1» para ase­gu­rar­te de que los archivos extraídos se almacenan di­re­c­ta­me­n­te en el di­re­c­to­rio «~/Kafka». De lo contrario, Ubuntu pondría todos los archivos en el di­re­c­to­rio «~/kafka/kafka_2.12-2.1.0», según la versión utilizada en este tutorial de Kafka. El requisito es que hayas creado pre­via­me­n­te un di­re­c­to­rio llamado «Kafka» mediante mkdir y lo hayas cambiado con «cd Kafka».

Kafka: tutorial para co­n­fi­gu­rar el sistema de tra­n­s­mi­sión y me­n­sa­je­ría

Ahora que has instalado Apache Kafka, Java Runtime En­vi­ro­n­me­nt y ZooKeeper, en principio podrás ejecutar el servicio de Kafka en cualquier momento. Sin embargo, antes de hacerlo, debes llevar a cabo unas pequeñas co­n­fi­gu­ra­cio­nes para que el software ejecute todas las tareas de manera óptima en el futuro.

De­s­blo­quear la eli­mi­na­ción de topics

En su co­n­fi­gu­ra­ción pre­de­te­r­mi­na­da, Kafka no permite eliminar topics, es decir, las unidades de al­ma­ce­na­mie­n­to y ca­te­go­ri­za­ción de un clúster de Kafka, aunque esto puede mo­di­fi­car­se fá­ci­l­me­n­te mediante el archivo de co­n­fi­gu­ra­ción server.pro­pe­r­ties. Para abrir este archivo, que se encuentra en la carpeta «config», introduce el siguiente comando en el editor de texto nano estándar:

sudo nano ~/kafka/config/server.properties

Después de este archivo de co­n­fi­gu­ra­ción, introduce una nueva entrada que permita eliminar los topics de Kafka:

delete.topic.enable=true
Consejo

No te olvides de guardar la nueva entrada en el archivo de co­n­fi­gu­ra­ción de Kafka antes de cerrar el editor nano.

Crear archivos .service para ZooKeeper y Kafka

El siguiente paso de este tutorial de Kafka es crear archivos Unit para ZooKeeper y Kafka que permitan realizar acciones ha­bi­tua­les como iniciar, detener o reiniciar ambos servicios en co­n­so­na­n­cia con otros servicios de Linux. Para ello, es necesario crear y co­n­fi­gu­rar los archivos .service para el ad­mi­ni­s­tra­dor de sesiones systemd para ambas apli­ca­cio­nes.

Cómo crear un archivo de ZooKeeper para el ad­mi­ni­s­tra­dor de sesiones systemd de Ubuntu

Primero, crea el archivo para el servicio de si­n­cro­ni­za­ción de ZooKeeper in­tro­du­cie­n­do el siguiente comando en el terminal:

sudo nano /etc/systemd/system/zookeeper.service

Con esto no solo crearás el archivo, sino que también lo abrirás en el editor nano. Introduce las si­guie­n­tes líneas y, luego, guarda el archivo:

[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target

Como resultado, systemd entenderá que ZooKeeper no puede iniciarse hasta que la red y el sistema de archivos estén listos, como se define en la sección [Unit]. En [Service] se es­pe­ci­fi­ca que el ad­mi­ni­s­tra­dor de sesión debe utilizar los archivos zookeeper-server-start.sh y zookeeper-server-stop.sh para iniciar y detener ZooKeeper. Además, se define un reinicio au­to­má­ti­co para los casos en los que el servicio se detenga de improviso. La entrada [Install] regula cuándo se inicia el archivo, es­ta­ble­cie­n­do «multi-user.target» como valor pre­de­te­r­mi­na­do para un sistema mu­l­tiu­sua­rio (por ejemplo, un servidor).

Cómo crear un archivo de Kafka para el ad­mi­ni­s­tra­dor de sesiones systemd de Ubuntu

El archivo .service de Apache Kafka se puede crear es­cri­bie­n­do el siguiente comando en el terminal:

sudo nano /etc/systemd/system/kafka.service

En el nuevo archivo que se abrirá en el editor nano, copia el siguiente contenido:

[Unit]
Requires=zookeeper.service
After=zookeeper.service
[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target

En la sección [Unit] de este archivo, se es­pe­ci­fi­ca que el servicio de Kafka depende de ZooKeeper, lo que asegura que el servicio de si­n­cro­ni­za­ción también se inicie cuando se ejecute el archivo kafka.service. Bajo [Service], se in­tro­du­cen los archivos del shell kafka-server-start.sh y kafka-server-stop.sh para iniciar o detener el servidor de Kafka. En este archivo también se es­pe­ci­fi­ca el reinicio au­to­má­ti­co en caso de caída de la conexión, así como la entrada referente al sistema mu­l­tiu­sua­rio.

Kafka: primer arranque y creación de una entrada de inicio au­to­má­ti­co

Una vez hayas creado con éxito las entradas del ad­mi­ni­s­tra­dor de sesiones para Kafka y ZooKeeper, puedes iniciar Kafka de la siguiente manera:

sudo systemctl start kafka

De forma pre­de­te­r­mi­na­da, el programa systemd utiliza un protocolo central o journal en el que todos los mensajes de registro se escriben au­to­má­ti­ca­me­n­te. Gracias a esta ca­ra­c­te­rí­s­ti­ca, te será fácil comprobar si el servidor Kafka se ha iniciado como deseas:

sudo journalctl -u kafka

El output debería tener este aspecto:

Si el inicio manual de Apache Kafka funciona, puedes activar fi­na­l­me­n­te el inicio au­to­má­ti­co como parte del inicio del sistema:

sudo systemctl enable kafka

Apache Kafka: tutorial para dar los primeros pasos

Ha llegado el momento de probar Apache Kafka. Antes que nada, deberás procesar un primer mensaje uti­li­za­n­do la pla­ta­fo­r­ma de me­n­sa­je­ría. Para ello, ne­ce­si­ta­rás un productor y un co­n­su­mi­dor, es decir, una instancia que permita escribir y publicar datos en topics, así como una instancia que pueda leer los datos de los topics. En primer lugar, crearás un topic, que se llamará Tu­to­ria­l­To­pic en este caso. Como se trata de un topic sencillo a modo de prueba, tan solo incluirá una partición y una réplica:

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic

A co­n­ti­nua­ción, crea un productor que inserte un primer mensaje de muestra (como «¡Hola, mundo!») en el topic que acabas de es­ta­ble­cer. Para ello, utiliza el script de shell kafka-console-producer.sh, que recibirá el nombre del host, el puerto del servidor (en el ejemplo: ruta pre­de­te­r­mi­na­da de Kafka) y el nombre del topic como ar­gu­me­n­tos:

echo "¡Hola, mundo!" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

Uti­li­za­n­do el script kafka-console-consumer.sh, crearás un co­n­su­mi­dor de Kafka que procesará y re­n­de­ri­za­rá mensajes de Tu­to­ria­l­To­pic. De nuevo, el nombre del host y el puerto del servidor de Kafka y el nombre del topic son ne­ce­sa­rios como ar­gu­me­n­tos. Además, se añadirá el argumento «--from-beginning» para que el mensaje «¡Hola, mundo!», que en este caso se publicó antes de que el co­n­su­mi­dor se iniciara, pueda ser procesado por este:

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

Como resultado, el mensaje «¡Hola, mundo!» aparece en el terminal, con el script eje­cu­tá­n­do­se y esperando a que se publiquen más mensajes en el topic de prueba. Por lo tanto, si in­tro­du­ces más datos en otra ventana del terminal mediante el productor, también deberías verlos en la ventana donde se ejecuta el script del co­n­su­mi­dor.

Ir al menú principal