Primeros pasos con Apache Kafka

12
35662

Primeros pasos con Apache Kafka

0. Índice de contenidos.


1. Introducción.

Apache Kafka es un sistema de almacenamiento publicador/subscriptor distribuido, particionado y replicado. Estas características, añadidas a que es muy rápido en lecturas y escrituras lo convierten en una herramienta excelente para comunicar streams de información que se generan a gran velocidad y que deben ser gestionados por uno o varias aplicaciones. Se destacan las siguientes características:

  • Funciona como un servicio de mensajería, categoriza los mensajes en topics.
  • Los procesos que publican se denominan brokers y los subscriptores son los consumidores de los topics.
  • Utiliza un protocolo propio basado en TCP y Apache Zookeeper para almacenar el estado de los brokers. Cada broker mantiene un conjunto de particiones (primaria y secundaria) de cada topic.
  • Se pueden programar productores/consumidores en diferentes lenguajes: Java, Scala, Python, Ruby, C++ …
  • Escalable y tolerante a fallos.
  • Se puede utilizar para servicios de mensajería (tipo ActiveMQ o RabbitMQ), procesamiento de streams, web tracking, trazas operacionales, etc.
  • Escrito en Scala.
  • Creado por LinkedIn.

En este tutorial vamos a ver una instalación básica en una máquina, crearemos un productor y un consumidor de topics y configuraremos un appender de logs propio de Kafka que podría servirnos para un sistema de trazas operacionales.

Puedes descargarte el código del tutorial desde aquí.

2. Entorno.

El tutorial se ha realizado con el siguiente entorno:

  • MacBook Pro 15′ (2.4 GHz Intel Core i5, 8GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS Mavericks 10.9.5
  • Oracle Java SDK 1.7.0_60
  • Apache Kafka 0.8.1.1

3. Instalación

Lo primero será descargarnos la última versión desde la página web oficial, actualmente es la 0.8.1.1.

Una vez descomprimido kafka, lo movemos al directorio que más nos guste, por ejemplo a /opt/kafka:

Tendremos que dar permisos de ejecución a los scripts dentro del directorio bin

Kafka necesitar Zookeeper para trabajar. Por defecto con la distribución viene uno para pruebas que arrancar una única instancia. Lo arrancamos a través del script de arranque zookeeper-server-start.sh

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

En otra consola arrancamos el servidor de Kafka:

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

Tanto la configuración de zookeeper como de kafka está en el directorio config donde se configuran los puertos de escucha, directorio de almacenamiento por defecto, número de particiones por defecto, etc.

Zookeeper escucha en el puerto 2181 y almacena por defecto los datos en /tmp/zookeeper. Kafka escuha en el puerto 9092.

4. Producer.

Kafka dispone de un API Java para construir productores y consumidores de mensajes. El productor es muy sencillo, únicamente se indica el servidor donde está corriendo Kafka y el topic por el que escribimos los mensajes:

5. Consumer.

Para ver de forma rápida si el producer está escribiendo en el topic indicado y le llega este mensaje a Kafka podemos arrancar un consumer por línea de comandos:

Ahora vamos a construirnos un Consumer mediante el API que nos proporciona Kafka.

Levantamos el Producer con el mensaje enviado para el topic ‘test’ y lo que va saliendo por el log del consumer es el mensaje que nos llega por estar suscritos al topic.

Creamos el consumer indicando el host y puerto donde está arrancado el broker. También se configuran parámetros para indiar un timeout, el tamaño del buffer y un identificador para el consumer.

La gran velocidad en lecturas que tiene Kafka se debe a que los topics se leen a partir de un puntero que marca el offset donde empiezan los mensajes. Es responsabilidad del consumer el mantenimiento de este offset.

La salida del consumer por consola devuelve lo mismo que por línea de comandos:

6. KafkaLog4jAppender.

Dada la velocidad con la que se escribe en Kafka, un posible caso de uso sería enviar a Kafka las trazas operacionales de nuestra aplicación. De esta forma podriamos configurar consumers de logs que fueran procesándolos para detectar problemas.

Kafka ya dispone de un Log4jAppender que nos hace todo el trabajo del productor de logs, únicamente tendríamos que configurarlo en nuestro log4j.properties:

Si lanzamos la clase KafkaConsumer vemos cómo en el topic ‘logs’ aparecen los logs de info que envía.

7. Referencias.

  • http://kafka.apache.org/07/quickstart.html
  • http://www.slideshare.net/miguno/apache-kafka-08-basic-training-verisign

8. Conclusiones.

Son muchos las compañias (LinkedIn, Twitter, Netflix, Square, Spotify, Pinterest, Uber, Tumblr y muchos más) las que utilizan Apache Kafka para analizar tráfico de sus aplicaciones, como parte de su infraestructura de procesamiento de datos, monitorización en tiempo real, como bus de eventos, etc.

En próximos tutoriales lo configuraremos para trabajar con Twitter y Storm.

Puedes descargarte el código del tutorial desde aquí.

Espero que te haya sido de ayuda.

Un saludo.

Juan

12 Comentarios

  1. […] ejemplo el sistema de almacenamiento distribuido Apache Kafka (como podemos ver en los tutoriales Primeros pasos con Apache Kafka ó Monitorización de Apache […]

  2. Tienes un error garrafal en el inicio.
    «chmod +x» da permisos para ejecutar.
    Bash interpreta * como todo, eso significa que directorios arriba y directorios abajo, a todo le diste permisos para ejecutarse.
    Eso es una idea muy mala y probablemente te cause problemas. Debes seleccionar solo los ejecutables que kafka instala.

    Saludos

  3. Citando el ejemplo, que mencionas sobre el consumidor de logs, esto lo podria aplicar para un servidor de aplicaciones, por ejemplo JBoss, procesando los logs con Kafka?.

    Un saludo, y gracias por el conocimiento.

  4. Hola Juan,
    Muchas gracias por el artículo.
    Con el ánimo de mejorar, debo decirte que hay una imprecisión al principio.
    Apache Kafka no es un sistema de almacenamiento.

    Saludos

  5. Genial! Gracias por el articulo.

    En mi caso, estoy mirando de utilizar esta herramienta para comunicación entre llamadas de micro-servicios. Creéis que podría ser una buena solución o quizás debería enfocar más a Rabbitmq?

    Gracias

Dejar respuesta

Please enter your comment!
Please enter your name here