Ejemplo sobre Kafka Log4j appender

Kafka ya sabemos que es un sistema distribuido y particionado de mensajería.

Conceptos

· Kafka mantiene los mensajes en categorías llamadas Topics.

· Productores publicar mensajes en un Topic Kafka.

· Los consumidores se suscriben a los Topics y reciben los mensajes publicados en estos Topics.

· Kafka se ejecuta como un cluster de uno o más servidores de cada una de los cuales se llama Broker.

Vamos a indicar como usar el KafkaLog4jApender para hacer un producer, que utilizando apache log4j, envíe las trazas a un servidor kakfa 0.8. Para ello vamos a ejecutar los siguientes pasos:

1. Creamos una aplicación java con maven:

mvn archetype:generate -DgroupId=com.howtodoinjava -DartifactId=log4jTestProject -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2. Al no estar la dependencia de kafka 0.8, en los repositorios centrales de maven, deberemos cogerla de la distribución binaría que se instala en la máquina con el producto, e instalarla nosotros en nuestro repositorio local.

mvn install:install-file -Dpackaging=jar -DgroupId=not.released -DartifactId=kafka -Dversion=0.8.0 -Dfile=kafka_2.8.0-0.8.0-beta1.jar

3. Añadimos las dependencias de maven necesarias para el proyecto dentro del pom.xml

dependencias

4. Editamos la clase App.java generada para que quede como sigue:

 

codigo

En este caso suponemos que tenemos un servidor kafka, que está escuchando en el puerto 9092, y que tiene creado un topic con el nombre de «test».

5. Empaquetamos el proyecto con

mvn package

6. Ejecutamos con:

mvn exec:java -Dexec.mainClass=»com.howtodoinjava.App»

7. Debemos tener arrancado el zookeeper, el servidor kafka, y haber creado un topic «test», como se indica en los primeros pasos aquí.

8. Arrancar un consumer sobre el topic, anteriormente creado para ver que se ha recibido el mensaje.

Respuestas

    1. A ver cuando lo vendes! con Kafka en pequeñas máquinas con discos grandes podíamos almacenar muchoooooos logs 🙂

  1. hum, buenas, siguiendo tus pasos me da esta excepción:

    Exception in thread «main» java.lang.NoClassDefFoundError: scala/Tuple2$mcJJ$sp
    at kafka.producer.ProducerConfig.(ProducerConfig.scala:56)
    at kafka.producer.KafkaLog4jAppender.activateOptions(KafkaLog4jAppender.scala:83)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)
    at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:440)
    at com.howtodoinjava.App.main(App.java:31)
    Caused by: java.lang.ClassNotFoundException: scala.Tuple2$mcJJ$sp
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    … 11 more

    He seguido tus pasos, a partir del quickstart, con la version 0.8, si intento hacer un ./sbt assembly-package-dependency me dice que no conoce esa acción 🙂 De hecho, si haces un ./sbt actions, ves que esa acción no está! Se nota que es un proyecto que esta en incubación, pero que tiene potencial.

Replica a Luis Miguel Gracia Luis Cancelar la respuesta