RSS

Apache Flume y Apache Sqoop

01 Sep

flume-logosqoop-logo

En el siguiente post vamos a hablar de dos librerías relacionadas con el manejo de grandes volumenes de datos , Apache Flume y Apache Sqoop . Aunque estas dos librerías tienen dos enfoques bastante distintos, la idea final de ambas es la misma. La funcionalidad de las dos es servir  como mecanismo de ingestión de datos durante la fase inicial de adquisición de datos como ya se indicó en el post anterior Fases en Big Data y su relación con librerías Hadoop.

En primer lugar vamos a ver Flume, después Sqoop y terminaremos con una breve comparativa entre ambas.

Apache Flume

Según la web oficial del proyecto Apache Flume:

Apache Flume es un sistema distribuido y seguro para recoger, agregar y mover grandes volúmenes de datos provenientes de logs desde distintas fuentes a un almacén de datos centralizado.

El uso de Apache Flume no sólo se ciñe a la agregación de datos desde logs. Debido a que las fuentes de datos son configurables, Flume permite ser usado para recoger datos desde eventos ligados al tráfico de red, redes sociales, mensajes de correo electrónico a casi cualquier tipo de fuente de datos posibles.

Arquitectura de Apache Flume

La arquitectura de Flume la podemos dividir en seis partes diferenciadas:

  • Fuente externa. Se trata de la aplicación o mecanismo, como un servidor web o una consola de comandos desde la cual se generan eventos de datos que van a ser recogidos por la fuente.
  • Fuente. Una fuente es un componente propio de Flume que se encarga de recoger eventos desde la fuente externa en un formato reconocible por Flume y pasarselos transaccionalmente al canal.
  • Canal. Un canal es otro componente de Flume que actuará de almacén intermedio entre la fuente y el sumidero. La fuente será la encargada de escribir los datos en el canal y permanecerán en él hasta que el sumidero u otro canal los consuman. Esto es muy importante ya que hace que el flujo de datos sea confiable y tolerante a fallos.
  • Sumidero. Este componente de Flume será encargado de recoger los datos desde el canal intermedio dentro de una transacción y de moverlos a un repositorio externo, otra fuente o a un canal intermedio.
  • Repositorio externo. Nos sirve para almacenar en un sistema de ficheros como puede ser HDFS los datos procesados en Flume.
  • Interceptores. Serán una parte transversal de la arquitectura y podrán ser relacionados cuando ocurran distintos tipos de eventos en el flujo. Los interceptores podrán procesar los datos y añadirles la lógica que se necesite.

data-flow-flume

Como hemos visto la arquitectura de Flume se basa en distintos componentes que son utilizados dentro de un flujo de datos a medida que se van generando distintos eventos. Este flujo estará gestionado por un agente Flume que va a ser un proceso que corra en la JVM. Además se deberá configurar los componentes de este flujo en un fichero de configuración. Flume permite indicar propiedades de estos componentes como el tipo de datos, la capacidad o el puerto donde van a estar escuchando.

Flume soporta en la actualidad cuatro tipos de protocolos para leer datos:

  • Avro
  • Thrift
  • Syslog
  • Netcat

Por lo tanto los distintos componentes de un flujo de eventos en Flume deberán implementar algún tipo de cliente o servidor que sea compatible con alguno de los cuatro protocolos anteriores. Hay un gran número de variables que pueden ser configuradas en función de que nuestras fuentes, canales o sumideros soporten alguno de los tipos de protocolos arriba mencionados. Se puede echar un ojo en el siguiente enlace.

Al tratarse de una arquitectura modular podemos concatenar distintos flujos para hacer un sistema más complejo como puede verse en la siguiente imagen:

varios-flows-flume

Ejemplo con Flume

La instalación de Flume es bastante parecida al resto de librerías del proyecto Apache. Puedes seguir una guía en el enlace Getting started with Flume de Eric Sammer.

Una vez instalado los ejecutables de Flume el siguiente paso será crear un fichero de configuración. Podemos hacerlo a través de un template en del fichero conf dentro del directorio de instalación. Uno de los ejemplos que podemos encontrar en las guías oficiales de Flume es el siguiente:

# 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

Dentro de este fichero de configuración podemos observar dos partes diferenciadas:

  • Componentes del sistema. En este caso definiremos un agente Flume (a1) que tendrá una fuente (r1) que estára escuchando en el puerto 4444, un sumidero (k1) que será de tipo logger y un canal intermedio (c1) que almacenará en memoria los datos escuchados por la fuente.
  • Flujo del sistema. En este ejemplo es muy sencillo. Se anotará que el canal entre la fuente y el sumidero será el canal que hemos definido en la configuración.

Arrancaremos el agente Flume desde consola con el comando:

$ bin/flume-ng agent –conf conf –conf-file example.conf –name a1 -Dflume.root.logger=INFO,console

Como último paso necesitaremos crear un evento de datos sobre el puerto 4444 donde estará escuchando nuestra fuente para comenzar con los datos procesados por Flume. Tras procesar los datos dentro del flujo los tendremos disponibles por consola con la prioridad INFO como hemos definido al lanzar el comando.

Comentar que hay otras herramientas similares a Flume muy interesante como S4 de Yahoo ó Apache Kafka.

Apache Sqoop

sqoop-logoApache Sqoop es una librería que permite importar datos desde un almacenamiento de datos estructurado, como una base de datos relacional, a Hadoop. Igualmente una vez que hayamos procesado los datos con HadoopHive o cualquier otra herramienta podemos exportar el resultado a un base de datos relacional.Sqoop también nos permite importar datos a otras bases de datos como Hive ó HBase.

Sqoop suministra una herramienta desde línea de comando a través de la cual se puede realizar todo el proceso de importación y exportación de datos desde una base de datos relacional a un sistema de ficheros distribuidos y viceversa.

Pasos a la hora de importar datos con Sqoop

Vamos a definir los pasos que se siguen la importación de datos usando Sqoop desde una base de datos relacional a HDFS. Un consejo antes de empezar es que hagamos uso de la ayuda propia de Sqoop. Para ello después de cada comando podemos escribir help y veremos ayuda sobre el comando de Sqoop en cuestión.

  1. La manera más sencilla de importar datos es hacerlo a través de la url de conexión con la base de datos en cuestión. En Sqoop esto se puede realizar mediante la opción –connect. El comando quedaría algo así:sqoop –connect <jdbc-uri>–username <username> –password <password>
  2. La ejecucción del anterior comando hará que se ejecute una tarea Hadoop para importar la información de la base de datos a HDFSSqoop será capaz automáticamente de transformar los registros de la base de datos en información a almacenar en HDFS. Si en algún momento se quiere por parte del desarrollador realizar alguna customización en esta importación (filtrado de registros, importación específica de alguna columna únicamente, …), Sqoop permite hacerlo igualmente.
  3. Una vez se termine la fase de importación como tal se generará una serie de ficheros que almacenen esta información. Sqoop permite definir que tipo de ficheros vamos a generar. Pueden ser ficheros de texto plano en formato CSV, ficheros binarios Avro o ficheros con formato secuencial.
  4. Además de los datos, Sqoop generará una clase Java que habrá sido utilizada durante todo el proceso de importación. Esta clase nos permitirá agilizar el desarrollo de tareas MapReduce más adelante. Además esta clase contendrá métodos que permitirán serializar/deserializar los datos almacenados.

La primera vez que use Sqoop me pareció muy similar a lo que podemos lograr con Hibernate tools ya que los dos permiten importar y crear clases Java utilizando como fuente una base de datos relacional. Obviamente la funcionalidad de Sqoop y de Hibernate tools no va más allá de aquí.

Exportar datos a Hive o HBase

Además de importar y exportar datos a bases de datos relacionales, una de las características más útiles que tiene Sqoop es almacenar estos datos en Hive ó HBase para posteriormente ser procesados.

sqoop –connect <jdbc-uri>–username <username> –password <password> –table tableName –hive-table tableName –hive-import –hive-home <hive-home>

Sqoop nos permite por ejemplo, importar estos datos a una tabla de Hive para luego realizar consultas sobre ellos. Sqoop nos va a permitir desde definir la tabla Hive donde queremos almacenar los datos hasta indicar dicha tabla si ya ha sido anteriormente creada desde Hive. El comando para lograr esto sería más o menos así:

El mismo tipo de mecanismo puede ser usado por HBase e imagino que a medida que el proyecto evolucione le dará soporte a más tipos de bases de datos.

Breve Comparativa entre Apache Flume y Apache Sqoop

Como hemos visto ambas herramientas sirven para mover grandes volumenes de datos hacia un repositorio HDFS. Sin embargo mientras que Sqoop está enfocado a bases de datos relacionales, Flume es más genérico y permite usar como entrada de datos un gran número de fuentes de eventos.

A diferencia de Flume, Apache Sqoop utiliza durante su ejecucción el paradigma MapReduce. Lo que permite procesar la información de manera paralela en procesos batch y lo diferencia de Flume que está pensado para procesos en streaming (intentando llegar a algo cercano a Real-time).

Flume por su parte permite definir el flujo de ejecucción de manera que podemos indicar los componentes por los que va pasando nuestra ejecucción. Esto no es posible con Sqoop, que directamente lanzará una o varias tareas MapReduce para procesar los datos.

Como siempre dejo los comentarios abiertos para esta entrada.

Enlaces anteriores

  1. Introducción a Big Data y Hadoop
  2. Introducción a MapReduce
  3. Introducción a HDFS
  4. Fases en Big Data y su relación con librerías Hadoop
  5. Introducción a Hive
 
Deja un comentario

Publicado por en 1 septiembre, 2013 en Hadoop

 

Etiquetas: , , , ,

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 )

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 )

Google+ photo

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

Conectando a %s

 
A %d blogueros les gusta esto: