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.
En caso de no disponer del servicio Flume en nuestra plataforma Cloudera, lo primero que haremos será desplegarlo.
A continuación nos dirigiremos a su pestaña de "Configuración" y seleccionaremos la opción "Ver y editar".
Ahora, pincharemos "Agent Default Group" del menú que nos aparecerá a la izquierda.
De la lista de campos que nos aparecerán, nos centraremos en el de "Archivo de configuración".
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:
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.- Pulsaremos sobre la lista desplegable ubicada junto al nombre de nuestro clúster.
- Seleccionaremos la opción "Agregar un servicio".
- Una vez se nos abra el asistente para agregar un servicio, marcaremos la opción Flume y pulsaremos el botón "Continuar".
- A continuación seleccionaremos un conjunto de dependencias de acuerdo a nuestra arquitectura y pulsaremos "Continuar".
- Nuestro siguiente paso será decidir sobre qué servidor se desplegará y configurará el agente. De nuevo pulsaremos el botón "Continuar".
- Nuestro último paso dentro de este asistente será pulsar el botón de "Finalizar".
Una vez desplegado el servicio, es hora de configurarlo. Lo primero, pinchar sobre el servicio Flume.
Cloudera - Servicios |
Cloudera & Flume |
Cloudera & Flume |
Cloudera & Flume - Configuración por defecto |
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:
- Abrir una conexión SSH con el servidor donde hemos desplegado el agente de Flume.
- bash# tail /var/log/flume-ng/flume-cmf-flume-AGENT-<servername>.log2015-01-07 17:13:16,170 INFO org.apache.flume.node.Application: Starting Channel channel12015-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 started2015-01-07 17:13:16,197 INFO org.apache.flume.node.Application: Starting Sink sink12015-01-07 17:13:16,197 INFO org.apache.flume.node.Application: Starting Source source12015-01-07 17:13:16,198 INFO org.apache.flume.source.NetcatSource: Source starting2015-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.Slf4jLog2015-01-07 17:13:16,241 INFO org.mortbay.log: jetty-6.1.26.cloudera.22015-01-07 17:13:16,252 INFO org.mortbay.log: Started SelectChannelConnector@0.0.0.0:41414
- bash# telnet 127.0.0.1 9999Trying 127.0.0.1...Connected to 127.0.0.1Escape character is '^]'.
Hello World! <enter>
OK - 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!. }
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.
- Configuraremos su tipo:tier1.sinks.sink1.type = hdfs
- 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 - 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 failedjava.lang.NullPointerException: Expected timestamp in the Flume event headers, but it was null - Estableceremos si así lo deseamos un prefijo para el nombre de los archivos:
tier1.sinks.sink1.hdfs.filePrefix = events - Salvamos la configuración y reiniciamos el servicio flume.
Por último para validar nuestra configuración:
- Abrir una conexión SSH con el servidor donde hemos desplegado el agente de Flume.
- 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 - 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 - 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 - 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 - 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 |
0 comentarios:
Publicar un comentario