Apache Sqoop

Definición de Sqoop

Sqoop logoApache Sqoop es una herramienta de línea de comandos desarrollada para transferir grandes volúmenes de datos de bases de datos relacionarles a Hadoop, de ahí su nombre que viene de la fusión de SQL y Hadoop. Concretamente transforma datos relacionarles en Hive o HBase en una dirección y en la otra de HDFS a datos relacionares como MySQL, Oracle, Postgress o a un data warehouse.

El proceso de transferencia consiste leer fila por fila cada tabla de la base de datos e importarlas a HDFS, la salida de estos es un conjunto de ficheros que puede estar en formato CSV, Avro, binario o de secuencia.

Recientemente se ha creado Sqoop2 para mejorar la usabilidad de Sqoop, proporcionando una aplicación web y mayor integración con Oozie.

 

Características

  • Proporciona una API Java para realizar el procesamiento en la ingesta. Permitiendo programar aplicaciones que realicen algunas tipo de transformación sobre los datos.
  • Proporciona comandos para listar tablas y esquemas.
  • Soporta cargas incrementarles de datos.
  • Proporciona multitud de conectores como FTP, JDBC, Kafka, Kite, SFTP

 

Ejemplo de como pasar datos entre MySQL y HDFS usando Sqoop

Prerequisitos

Tener instalado Hortonworks (Virtual Box) para Spark

Creación de tabla en base de datos MySQL

Se crea una base de datos con una tabla sobre la que realizará las pruebas, para ello se utilizarán los siguientes comandos.

Acceder a MySql

$ mysql
Puede probocar un ERROR 1045 (28000): Access denied for user ‘root’@’localhost,  que se soluciona:
mysql -u root -p

Nota: tener en cuenta que la lave de MySQL y la del sistema pueden ser diferentes.

Consultar base de datos

mysql> show databases;

Crear base de datos

mysql> create database mibbdd;

Usar base de datos

mysql> use mibbdd;

Crear tabla base

mysql> CREATE TABLE mitabla(
         id MEDIUMINT NOT NULL AUTO_INCREMENT,
         nombre CHAR(30) NOT NULL,
         edad INTEGER(30),
         salario INTEGER(30),
         PRIMARY KEY (id) );

Crear tabla 2

mysql> CREATE TABLE mitabla2(
         id MEDIUMINT NOT NULL AUTO_INCREMENT,
         nombre CHAR(30) NOT NULL,
         edad INTEGER(30),
         salario INTEGER(30),
         PRIMARY KEY (id) );

Insertar datos

mysql> INSERT INTO mitabla (nombre, edad, salario) VALUES
        ("Pedro", 24, 21000), ("Maria", 26, 24000), ("Juan", 28, 25000), ("Luis", 35, 28000), ("Monica", 42, 30000), ("Rosa", 43, 25000), ("Susana", 45, 39000);

Nota: Si se tiene problemas de permiso entrar en mysql y dar todos los permisos:

grant all privileges on *.* to 'root'@'localhost' IDENTIFIED BY 'Clave_MySQL' WITH GRANT OPTION;

Salir de MySql

mysql> exit;

 

Cargar datos de MySQL a HDFS

Ejemplo de carga de datos desde la tabla “mitabla” de la base de datos “mibbdd” a la carpeta de hdfs de nombre “mitabla_hdfs”

mysql a hdfs

$ sqoop import \
 --connect jdbc:mysql://localhost/mibbdd \
 --username=root -P \
 --table=mitabla \
 --driver=com.mysql.jdbc.Driver \
 --target-dir=/mitabla_hdfs \
 --fields-terminated-by=',' \
 --lines-terminated-by '\n'

target-dir: fichero HDFS donde se almacena
table: Identifica la tabla a copiar
clear-staging-table: Indica que se puede borrar los datos pasados
verbose: Imprime información adicional para facilitar la depuración
fields-terminated-by: Definir el delimitador

 

Cargar datos de HDFS a MySQL

Ejemplo de carga de datos desde la carpeta de hdfs de nombre “mitabla_hdfs”  a la tabla “mitabla2” de la base de datos “mibbdd”.

hdfs a mysql

$ sqoop export \
 --connect jdbc:mysql://localhost/mibbdd \
 --username=root -P \
 --table=mitabla2 \
 --export-dir=/mitabla_hdfs - m 1

 

Nota: Si se tiene problemas “set $ ACCUMULO_HOME to the root in your Accumulo intallation”, se puede evitar con:

$ ACCUMULO_HOME='/var/lib/accumulo'
$ export ACCUMULO_HOME
$ sudo mkdir /var/lib/accumulo

Para practicar con Sqoop pues consultar: “Ejemplos de Sqoop“, en este apartado recopilo multitud de ejemplos que pueden servirte de utilidad.

 

Consultar la documentación oficial para Shell

Consultar la documentación oficial para API JAVA

Otros artículos que pueden ser de interés:

Autor: Diego Calvo