El punto fuerte de la plataforma Hadoop es la posibilidad de trabajar con datos en diferentes formatos. Por lo general, en las organizaciones los datos se almacenan de forma estructurada en sistemas de bases de datos relacionales (RDBMS) o datawarehourse. Apache Sqoop es una herramienta que nos permite extraer información de un sistema estructurado (como por ejemplo SQL Server, MySQL o Oracle) y almacenarlo en HDFS (Hadoop Distributed File System) para sea procesada posteriormente. El procesamiento se puede hacer mediante programas de MapReduce o mediante otras herramientas como Hive. Una vez hemos explotado los datos y obtenido los resultados necesarios, podemos exportar dichos resultados a una base de datos relacional para presentarlos a usuarios finales. Además, Sqoop está integrado con Oozie, que permite la programar y automatizar tareas de importación y exportación.

Sqoop ejecuta internamente programas de MapReduce para llevar a cabo las acciones de importación y exportación, lo que proporciona paralelismo y tolerancia a fallos.

Comandos Sqoop

Sqoop está compuesto por una colección de comandos o herramientas. Las herramientas disponibles son (veremos cada una de ellas en detalle en futuros posts):

  • codegen: genera código (clases Java) para interactuar con los datos importados de la base de datos
  • create-table-hive: Importa una tabla a Hive
  • eval: evalúa una sentencia SQL y muestra el resultado.
  • export: exporta desde HDFS a una tabla de una base de datos
  • import: importa una tabla de una base de datos a HDFS
  • import-all-tables: importa todas las tablas de una base de datos a HDFS
  • list-databases: muestra un listado de las bases de datos en el servidor
  • list-tables: muestra un listado de las tablas pertenecientes  a una base de datos

 

Funcionamiento Sqoop

Como se ha comentado, Sqoop ejecuta internamente programas de MapReduce para llevar a cabo las operaciones de transferencia de datos. Los datos transferidos entre el sistema RDBMS y Hadoop se dividen en diferentes particiones y se ejecuta un programa Map con diferentes Reducers encargados de transferir cada parte del conjunto de datos. ¿Y qué hay de los tipos de datos? HDFS o Hive no soporta los mismos tipos de datos que pueda soportar SQL Server por ejemplo. Para controlar esto,  Sqoop usa los metadatos de la base de datos para deducir los tipos de datos, internamente convierte los tipos de datos nativos de la base de datos externa en tipos de datos correspondientes a Hive, Sqoop elige automáticamente el delimitador nativo que se utiliza en Hive.

El proceso interno en el proceso de importación es:

(1)  Sqoop obtiene los metadatos de los datos que se van a importar

(2) Sqoop envía un trabajo Map al cluster. El trabajo Map realiza las operaciones de transferencia de datos usando los metadatos obtenidos del paso (1).

Imagen 1: Importación Sqoop

Imagen 1: Importación Sqoop

 

El proceso de exportación desde HDFS al sistema RDBMS sería trivial al de importación.

(1) Se obtienen los metadatos de la base de datos del servidor.

(2) Sqoop divide los datos de entrada en partes y lanza trabajos Map individuales para enviar cada una de las partes a la base de datos. Cada trabajo realiza su transferencia de datos sobre una parte de los datos con el fin de asegurar un óptimo rendimiento y minimizar el uso de recursos.

Imagen 2: Exportación Sqoop

Imagen 2: Exportación Sqoop

Novedades: Sqoop2

Sqoop es un proyecto de Apache que está en constante evolución. Hasta ahora Sqoop presentaba algunas restricciones, preocupaciones en la seguridad y problemas en la facilidad de uso. Como por ejemplo:

  • Los instrucciones por línea de comandos pueden conllevar a error.
  • Debido a la conexión entre la transferencia de datos y el formato de serialización, algunos conectores pueden soportar un formato de datos que otros no (por ejemplo, conector de MySQL no puede soportar la transferencia de archivos de secuencia)
  • Hay problemas de seguridad con las credenciales compartidas.
  • Los conectores están obligados a seguir el modelo JDBC.

Con el fin de paliar estar restricciones, surge Sqoop2, todavía en desarrollo, pero con notables mejoras.

Sqoop2 contará con una interfaz gráfica basada en web y se ejecutará como un servicio. La interfaz de usuario está construida sobre una API REST que se puede invocar mediante línea de comandos simulando la misma funcionalidad como hasta ahora. Mediante esta interfaz el usuario podrá realizar tareas de importación/exportación. Además, los conectores se añaden a la aplicación, por lo que el usuario no tendrá que instalarlos. Se introducen nuevos roles, “Admin” y “Operator” en Sqoop2, lo cual restringirá el acceso a operaciones de “create” para roles de “Admin” y operaciones “execute” para roles de “Operator”. Mediante este modelo permitirá una integración con la plataforma de seguridad y permitirá a usuarios finales sólo ejecutar instrucciones aplicables a su rol.

La arquitectura de Sqoop sería como la Figura 3:

Imagen 3: Arquitectura Sqoop2

Imagen 3: Arquitectura Sqoop2

 

Sqoop2 estará instalado y configurado en el lado servidor. Esto significa que los conectores se configurarán en un sólo lugar, se gestionarán por el Admin y se ejecutarán por el Operator. Además, el servicio de Sqoop2 estará integrado con Hive y HBase en el lado del servidor también.  La interfaz interactiva de Sqoop2 permitirá a los usuarios realizar tareas de importación y exportación eliminando pasos redundantes y omitiendo opciones incorrectas.

Actualmente, Sqoop se ejecuta mediante un comando que ejecuta el usuario. La seguridad está determinada por las credenciales introducidas por el usuario al lanzar un trabajo Sqoop. En el futuro, Sqoop2 funcionará como una aplicación basada en servidor con soporte para acceder a los sistemas externos a través de un acceso basado en roles. Y, finalmente, para mayor seguridad, Sqoop2 ya no permitirá la generación de código.