Flume está diseñado para la
ingestión de grandes volúmenes de datos basados en eventos en Hadoop. El
ejemplo clásico es usar Flume para recopilar logs de un banco de servidores
web, y luego mover los eventos del log de esos archivos a nuevos archivos
agregados a una Data Lake en HDFS para su procesamiento. El destino habitual (o sink en el lenguaje de Flume) es HDFS.
Sin embargo, Flume es lo suficientemente flexible como para escribir en otros
sistemas, como HBase o Solr.
Para usar Flume, necesitamos
ejecutar un agente Flume, que es un demonio
Java que ejecuta fuentes y receptores (sink) conectados por canales. Una fuente en Flume genera
eventos y los entrega al canal, que almacena los eventos hasta que se envían al
receptor. Se puede pensar en la combinación fuente-canal-receptor como un componente
básico de Flume.
Una instalación Flume está
formada por una colección de agentes conectados que se ejecutan en una
topología distribuida. Los agentes en los límites del sistema (ubicados en servidores
web, por ejemplo) recopilan datos y los envían a los agentes que son
responsables de agregar y luego almacenar los datos en su destino final. Los
agentes están configurados para ejecutar una colección de fuentes y receptores
particulares, por lo que utilizar Flume es principalmente un ejercicio de
configuración para encajar las piezas.
Ejemplo de Arquitectura Flume |
Caso de uso sencillo a modo de ejemplo
Para
mostrar cómo funciona Flume, comencemos con una configuración que:
·
Vigile nuevos archivos de texto en un directorio
local
·
Envía cada línea de cada archivo a la consola a
medida que se añaden los archivos
Añadiremos los archivos a mano,
pero es fácil imaginar un proceso como el de un servidor web que crea nuevos
archivos que queremos ingestar continuamente con Flume. Además, en un sistema
real, en lugar de registrar el contenido del archivo en el log, escribiríamos el
contenido en HDFS para su posterior procesamiento.
En este ejemplo, el agente Flume
ejecuta una única fuente-canal-receptor, configurado con un archivo de
propiedades de Java. La configuración controla los tipos de fuentes, receptores
y canales que se utilizan, así como también la forma en que se conectan entre
sí.
Configuración de Flume usando una fuente de directorio de spooling y un receptor Logger |
Los nombres de propiedades forman
una jerarquía con el nombre del agente en el nivel superior. En este ejemplo,
tenemos un único agente, llamado agent1. Los nombres de los
diferentes componentes de un agente se definen en el siguiente nivel, por lo
que agent1.sources
lista los nombres de las fuentes que se deben ejecutar en agent1 (aquí es una
fuente única, source1). Del mismo modo, agent1 tiene un receptor (sink1)
y un canal (channel1).
Las propiedades de cada
componente se definen en el siguiente nivel de la jerarquía. Las propiedades de
configuración disponibles para un componente dependen del tipo de componente.
En este caso, agent1.sources.source1.type está configurado en spooldir,
que es un origen que supervisa nuevos archivos en una cola de directorio. El
origen de la cola de directorio define una propiedad spoolDir, por lo que para
source1,
la clave completa es agent1.sources.source1.spoolDir. Los
canales de la fuente se establecen con agent1.sources.source1.channels.
El receptor es de tipo logger
para registrar eventos en la consola. También debe estar conectado al canal
(con la propiedad agent1.sinks.sink1.channel). El canal es un canal de tipo file,
lo que significa que los eventos del canal se persisten a disco para una mayor
durabilidad. El sistema se ilustra en la figura 14-1.
Antes de ejecutar el ejemplo,
necesitamos crear el directorio de spooling en el sistema de archivos local:
% mkdir /tmp/spooldir
Entonces podemos iniciar el agente Flume usando el comando flume-ng:
% flume-ng agent \
--conf-file spool-to-logger.properties \
--name agent1 \
--conf $FLUME_HOME/conf \
-Dflume.root.logger=INFO,console
El
archivo de propiedades Flume del Ejemplo 14-1 se especifica con el indicador --conf-file. El nombre del agente
también se debe pasar con --name (ya
que un archivo de propiedades de Flume puede definir varios agentes, tenemos
que decir cuál ejecutar). El indicador --conf
le dice a Flume dónde encontrar su configuración general, como la configuración
del entorno.
En una nueva terminal, crea un archivo
en el directorio de spooling. La fuente del directorio de spooling espera que
los archivos sean inmutables. Para evitar que los archivos parcialmente
escritos sean leídos por la fuente, escribimos el contenido completo en un
archivo oculto. Luego, hacemos un cambio de nombre atómico para que la fuente
pueda leerlo:
% echo "Hello Flume"
> /tmp/spooldir/.file1.txt
% mv /tmp/spooldir/.file1.txt
/tmp/spooldir/file1.txt
De vuelta al terminal del agente, vemos que Flume ha
detectado y procesado el archivo:
Preparing to
move file /tmp/spooldir/file1.txt to
/tmp/spooldir/file1.txt.COMPLETED
Event: {
headers:{} body: 48 65 6C 6C 6F 20 46 6C 75 6D 65 Hello Flume }
La fuente del directorio de spooling
ingiere el archivo dividiéndolo en líneas y creando un evento Flume para cada
línea. Los eventos tienen cabeceras opcionales y un cuerpo binario, que es la
representación UTF-8 de la línea de texto. El logger receptor registra el
cuerpo en el log en forma hexadecimal y de cadena. El archivo que colocamos en
el directorio de cola solo tenía una línea, por lo que solo se registró un
evento en este caso. También vemos que el archivo fue renombrado como
file1.txt.COMPLETED por la fuente, lo que indica que Flume ha terminado de
procesarlo y no lo procesará nuevamente.
Para una referencia más detallada
consultar http://flume.apache.org.
0 comentarios:
Publicar un comentario
Gracias por participar en esta página.