Searching...
lunes, 8 de enero de 2018

Introducción a la ingesta de datos con Flume

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.

 
Back to top!