Apache Sqoop

por | Jul 6, 2018 | Big data, Hadoop | 8 Comentarios

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

8 Comentarios

  1. Marco Aguilar

    Hola que tal, buen día.
    Me llamo Marco, me gustaría saber si se pueden hacer ingestas entre Sqoop y DB2.

    Muchas gracias por la información, excelente pagina.

    Saludos.

    Responder
  2. Leonardo Villa

    Hola Diego, ante todo muy buena publicacion me esta ayudando en mi investigacion, queria hacerte una consulta:
    Estoy haciendo una ETL desde cero, el cliente nos ha dado via libre para usar bigdata … queremos cargar unos ficheros en una BBDD relacional (Oracle) y hemos pensado en hacerlo con Sqoop (cargariamos el fichero en una tabla y de ahi hariamos las transformaciones) esto vendria hacer una ELT y no una ETL?, Queremos utilizar algun componente de BigData, pero no sabemos si con Sqoop, Scala, Spark u otro componente nos vendria mejor?

    Responder
  3. Diego Calvo

    Buenas Leonardo,
    Te recomiendo que valores también otras herramientas que te pueden facilitar la ingesta de datos como NIFI. (https://www.diegocalvo.es/nifi/)
    Par la parte de transformación de datos yo suelo usar Spark.

    Responder
    • Leonardo Villa

      Gracias Diego …

      Responder
  4. Estela Ventura

    Soy nueva con la tecnologia y tengo una consulta se puede utilizar sqoop con sql2016 ? podrian referirme un manual porfavor para saber como utilizarlo mil gracias

    Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *