Apache Flume

Publicado por

Apache Flume es un sistema distribuido, confiable y disponible para recoger, agregar y mover grandes cantidades de datos en logs desde diferentes orígenes a un almacén centralizado. Si tenemos una situación en la que los datos no se generan regularmente y queremos hacer una carga masiva de ellos, quizás Flume sea excesivo para esa tarea.

Índice

  1. Introducción
  2. Características
  3. Arquitectura
  4. Configuración

1. Introducción

El uso de Flume no solo está restringido a la recogida y agregación de logs. Como los orígenes son personalizables, Flume puede transportar gran cantidad de eventos incluyendo datos generados por las redes sociales, tráfico de red, mensajes de correo electrónico y casi cualquier fuente de datos configurable.

Apache Flume comienza a desarrollarse en 20010 (poco después que Scribe por Facebook), como servidor de logs, y pasa a la incubadora como proyecto Apache en el 2010 (v.1.0.0), en Julio de 2012 se convierte en proyecto Top (v.1.2.0).

apache_flume

Img: tutorialspoint.com

2. Características

Un agente es un proceso java (JVM) que aloja los componentes a través de los cuales los eventos fluyen de una fuente externa a un destino.

En cada agente los eventos se alojan en un canal, después se entregan al siguiente agente o a un repositorio central (como HDFS).

  • Flume permite construir al usuario flujos de múltiples saltos donde viajan los eventos a través de diferentes agentes antes de alcanzar el destino final.
  • Los eventos son borrados del canal, solo cuando se han guardado en el canal del siguiente agente, o en un repositorio final.
  • Flume utiliza un enfoque transaccional para garantizar la entrega confiable de los eventos. Las operaciones (almacenamiento o recuperación) para un canal entre fuente y emisor se encapsulan en una transacción.
  • Los eventos se encuentran en el canal, que maneja la recuperación en caso de fallo. Flume soporta un canal duradero que se encuentra respaldado por el sistema de ficheros local. También existe un canal en memoria que almacena los eventos en una cola en memoria, que es más rápida, pero si se produce un error en el proceso del agente, estos eventos no se podrán recuperar.

3. Arquitectura

A continuación resumimos las conceptos de Flume.

  • Evento: una carga de bytes, con encabezados opcionales, que representan la unidad de datos que Flume puede transportar desde el origen hasta el destino.
  • Flujo de datos: es el movimiento de eventos desde el origen al destino.
  • Cliente: es la implementación de una interfaz que recoge los eventos y se los entrega a un agente de Flume. Suele operar en el espacio de proceso de la aplicación de la que se están consumiendo los datos.
  • Agente: es un proceso independiente que aloja otros componentes como sourcessinkschannels. Se encarga de recibir, guardar y enviar eventos.
  • Source: es la implementación de una interfaz que puede consumir eventos que le son envíados con un mecanismo específico. Por ejemplo la interfaz de Avro es un implementación que permite recibir eventos Avro desde clientes u otros agentes y ponerlos en un canal.
  • Channel: es un almacén transitorio de eventos, estos eventos son entregados al canal a  través de las fuentes que operan en el agente.
  • Sink: es la implementación de una interfaz que permite eliminar eventos de un canal y transmitirlos al siguiente agente en el flow o a su destino final. Estos últimos son conocidos como terminal sink.  Por ejemplo, HDFS.

userguide_image00

Img: flume.apache.org

Flujo de datos

Un source consume eventos dirigidos hacia él desde una fuente externa, por ejemplo, un servidor de aplicaciones. La fuente externa envía eventos a Flume en un formato que es reconocible para el source al que va dirigido. Cuando un source recibe un evento, lo almacena en uno o varios canales. El canal es un almacenamiento transitivo que guarda los eventos hasta que son consumidos por un sink. Por ejemplo, el canal de ficheros está respaldado por el sistema de ficheros local. El sink elimina el evento del canal y lo pone en un repositorio externo como HDFS o lo manda al siguiente source del siguiente agente en el flujo de datos.

Confiabilidad

Depende de varios factores:

  • Que tipo de canal utilizar: Flume tiene dos opciones para los canales, duraderos que persisten los datos en disco y efímero que son canales que trabajan en memoria. Los canales que guardan en el disco duro soportan la tolerancia a fallos y pueden recuperar la información del agente en caso de error, en cambio los efímeros no.
  • Capacidad del canal: los canales en Flume actúan como buffers, estos tienen una capacidad fija y una vez que se llenan, crearán problemas en puntos anteriores del flujo, si se propaga al source puede que tire el servicio y se pierdan datos. Por ejemplo si un sink final queda fuera de servicio.
  • Utilizar topologías de disco redundantes para replicar la información a través de los nodos.

4. Configuración

Agente: la configuración de un agente en Flume se guarda en un fichero de configuración local. Es un fichero de texto similar al .properties de Java. En un fichero pueden estar las configuraciones de varios agentes. Estos ficheros también incluyen las propiedades de los sources, channels y sinks y como están conectados entre ellos para crear el flujo de datos.

Componentes individuales:Cada componente del flujo de datos tiene un nombre,un tipo y un conjunto de propiedades  específicas de cada tipo. Por ejemplo,  un source de Avro necesita una IP y un puerto por el que recibir datos.

Cuando todas las piezas están configuradas individualmente, debemos conectarlas entre ellas para construir el flujo de datos. Esto se hace listando cada componente del agente y especificando un channel para cada sourcesink.

# example.conf: A single-node Flume configuration

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# Describe the sink
a1.sinks.k1.type = logger

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

Zookeeper: Flume soporta la configuración de agentes a través de Zookeeper. De momento esta es una característica experimental. El fichero de configuración se sube a Zookeeper bajo un prefijo configurable.

Flume soporta los siguientes mecanismos de lectura de logs en streams: Avro, Thrift, Syslog y Netcat.

Existen dos pasos importante en los flujos de Flume, uno es la consolidación, cuando existen varios sinks como sources del último agente. Y la multiplexación que dado un source se conecta a varios canales para ofrecer multiples sinks.

Fuentes

Apache Flume User Guide
Cloudera Flume

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s