jueves, 8 de enero de 2015

[Cloudera & Flume] WebService to HDFS

Flume
Flume


«Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexible architecture based on streaming data flows. It is robust and fault tolerant with tunable reliability mechanisms and many failover and recovery mechanisms. It uses a simple extensible data model that allows for online analytic application» +info.



Flume Web Service to HDFS
[Flume] Web Service to HDFS
En caso de no disponer del servicio Flume en nuestra plataforma Cloudera, lo primero que haremos será desplegarlo.
  1. Pulsaremos sobre la lista desplegable ubicada junto al nombre de nuestro clúster.
  2. Seleccionaremos la opción "Agregar un servicio".
  3. Una vez se nos abra el asistente para agregar un servicio, marcaremos la opción Flume y pulsaremos el botón "Continuar".
    Cloudera - Agregar Servicio
    Cloudera - Agregar Servicio
  4. A continuación seleccionaremos un conjunto de dependencias de acuerdo a nuestra arquitectura y pulsaremos "Continuar".
  5. Nuestro siguiente paso será decidir sobre qué servidor se desplegará y configurará el agente. De nuevo pulsaremos el botón "Continuar".
    Cloudera - Agregar Servicio
    Cloudera - Agregar Servicio
  6. Nuestro último paso dentro de este asistente será pulsar el botón de "Finalizar".
    Cloudera - Agregar Servicio
    Cloudera - Agregar Servicio
Una vez desplegado el servicio, es hora de configurarlo. Lo primero, pinchar sobre el servicio Flume.
Cloudera - Servicios
A continuación nos dirigiremos a su pestaña de "Configuración" y seleccionaremos la opción "Ver y editar".
Cloudera & Flume
Cloudera & Flume
 Ahora, pincharemos "Agent Default Group" del menú que nos aparecerá a la izquierda.
Cloudera & Flume
Cloudera & Flume
De la lista de campos que nos aparecerán, nos centraremos en el de "Archivo de configuración".
Cloudera & Flume - Configuración por Defecto
Cloudera & Flume - Configuración por defecto
En dicho campo podremos pegar la configuración de nuestro agente Flume en caso de disponer de una y sino podremos proceder a ello.

Antes de continuar, decir que esta configuración que se nos establece por defecto, permite registrar en el log de flume de nuestro servidor los mensajes locales recibidos a través del puerto 9999.

He aquí la demostración:
  1. Abrir una conexión SSH con el servidor donde hemos desplegado el agente de Flume.
  2. bash# tail /var/log/flume-ng/flume-cmf-flume-AGENT-<servername>.log
    2015-01-07 17:13:16,170 INFO org.apache.flume.node.Application: Starting Channel channel1
    2015-01-07 17:13:16,197 INFO org.apache.flume.instrumentation.MonitoredCounterGroup: Monitored counter group for type: CHANNEL, name: channel1: Successfully registered new MBean.
    2015-01-07 17:13:16,197 INFO org.apache.flume.instrumentation.MonitoredCounterGroup: Component type: CHANNEL, name: channel1 started
    2015-01-07 17:13:16,197 INFO org.apache.flume.node.Application: Starting Sink sink1
    2015-01-07 17:13:16,197 INFO org.apache.flume.node.Application: Starting Source source1
    2015-01-07 17:13:16,198 INFO org.apache.flume.source.NetcatSource: Source starting
    2015-01-07 17:13:16,207 INFO org.apache.flume.source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:9999]
    2015-01-07 17:13:16,217 INFO org.mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
    2015-01-07 17:13:16,241 INFO org.mortbay.log: jetty-6.1.26.cloudera.2
    2015-01-07 17:13:16,252 INFO org.mortbay.log: Started SelectChannelConnector@0.0.0.0:41414
  3. bash# telnet 127.0.0.1 9999
    Trying 127.0.0.1...
    Connected to 127.0.0.1
    Escape character is '^]'.
    Hello World! <enter>
    OK
  4. bash# tail /var/log/flume-ng/flume-cmf-flume-AGENT-<servername>.log
    ...
    2015-01-07 17:13:16,252 INFO org.mortbay.log: Started SelectChannelConnector@0.0.0.0:41414
    2015-01-07 17:20:44,360 INFO org.apache.flume.sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0D          Hello World!. }
Ahora bien, como podemos ver el valor de la variable tier1.sources.source1.bind que Cloudera nos establece por defecto en el agente, es 127.0.0.1, vamos, Flume sólo atenderá a peticiones locales. Por lo tanto habremos de modificar su valor para que responda a través del interfaz deseado de nuestro servidor o bien establecer el valor de 0.0.0.0 para que responda por cualquiera de sus interfaces. Con esto lograremos poder volcar información desde cualquier otro punto de nuestra infraestructura en este sistema.

De igual modo procederemos con la variable tier1.sources.source1.port si deseamos modificar el puerto por el que responda nuestro agente.

Cualquier cambio que hagamos en este apartado de configuración, acordarse de pulsar sobre el botón "Guardar cambios" y si aplicara, reiniciar el servicio Flume.

Así pues, ya seríamos capaces de recibir mensajes a través de un puerto y registrarlos en nuestro sistema, pero NO volcarlos sobre nuestro HDFS.

Nuestro siguiente paso por lo tanto sería configurar el recurso denominado sink de nuestro agente para llevar acabo dicha acción.
  1. Configuraremos su tipo:tier1.sinks.sink1.type = hdfs
  2. Para que Flume almacene los eventos recibidos como texto en los archivos de nuestro HDFS:
    tier1.sinks.sink1.hdfs.fileType = DataStream
    tier1.sinks.sink1.hdfs.writeFormat = Text
  3. Definiremos el path de nuestro HDFS en donde queremos dejar registrados los eventos que recibiremos.
    tier1.sinks.sink1.hdfs.path = hdfs://<serverip>:8020/user/flume/syslog/%y%m%d


    Nota: Recordad crear y configurar los permisos del directorio deseado, en mi caso de /user/flume/syslog/

    En caso de parametrizar la variable 
    tier1.sinks.sink1.hdfs.path con algún campo o variable relacionada con timestamps (%Y = año, %y = sólo los dos últimos dígitos del año, %m = mes, %d = día, %H = hora, %M = minuto, %S = segundos, %s = segundos desde 1970-01-01 00:00:00 UTC) será recomendable también incluir la variable tier1.sinks.sink1.hdfs.useLocalTimeStamp a true pues sin ella y si los mensajes que enviemos carecen de la cabecera necesaria, nos dará el siguiente error:
    ERROR org.apache.flume.sink.hdfs.HDFSEventSink: process failed
    java.lang.NullPointerException: Expected timestamp in the Flume event headers, but it was null
  4. Estableceremos si así lo deseamos un prefijo para el nombre de los archivos:
    tier1.sinks.sink1.hdfs.filePrefix = events
  5. Salvamos la configuración y reiniciamos el servicio flume.
Por último para validar nuestra configuración:
  1. Abrir una conexión SSH con el servidor donde hemos desplegado el agente de Flume.
  2. bash# tail /var/log/flume-ng/flume-cmf-flume-AGENT-<servername>.log
    ...
    2015-01-07 17:16:09,184 INFO org.apache.flume.instrumentation.MonitoredCounterGroup: Component type: SINK, name: sink1 started

    2015-01-07 17:16:09,190 INFO org.apache.flume.source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:9999]
    2015-01-07 17:16:09,200 INFO org.mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
    2015-01-07 17:16:09,224 INFO org.mortbay.log: jetty-6.1.26.cloudera.2

    2015-01-07 17:16:09,234 INFO org.mortbay.log: Started SelectChannelConnector@0.0.0.0:41414
  3. bash# telnet 127.0.0.1 9999
    Trying 127.0.0.1...
    Connected to 127.0.0.1
    Escape character is '^]'.
    Hello World! <enter>
    OK
  4. bash# tail /var/log/flume-ng/flume-cmf-flume-AGENT-<servername>.log
    ...
    2015-01-07 17:16:09,234 INFO org.mortbay.log: Started SelectChannelConnector@0.0.0.0:41414
    2015-01-07 17:17
    :00,261 INFO org.apache.flume.sink.hdfs.HDFSDataStream: Serializer = TEXT, UseRawLocalFileSystem = false

    2015-01-07 17:17:00,329 INFO org.apache.flume.sink.hdfs.BucketWriter: Creating hdfs://<serverip>:8020/user/flume/syslog/150107/events.1420707900262.tmp
  5. bash# hadoop fs -ls /user/flume/syslog/150107/ Found 1 items
    -rw-r--r--   3 flume flume         14 2015-01-07 17:17 /user/flume/syslog/150107/events.1420707900262
  6. bash# hadoop fs -cat /user/flume/syslog/150107/events.1420707900262Hello World!
Aquí os dejo la captura de la configuración final:
Cloudera & Flume - Configuración WebService to HDFS
Cloudera & Flume - Configuración WebService to HDFS

0 comentarios:

Publicar un comentario