Apache Sqoop

Publicado por

Lo empezó a desarrollar Aaron Kimball en el 2009 por la multitud de conectores que se estaban realizando para ingestar datos en Hadoop y unificar el acceso a bases de datos para importar y exportar datos. Cloudera lo propuso para la incubadora de proyectos. Apache lo aceptó en el 2011 y en 2012 se graduó y paso a ser un proyecto Top-Level. “SQL to Hadoop and Hadoop to SQL”

Índice

  1. Introduccción
  2. Shell
  3. API Java

1.Introducción

Apache Sqoop es una herramienta diseñada para soportar cargas de volúmenes elevados de datos entre Hadoop y una base de datos relacional. Se puede utilizar para importar datos desde un almacenamiento externo en el sistema de ficheros distribuido de Hadoop, en Hive o en HBase. Inversamente, Sqoop puede utilizarse para extraer datos de HDFS y exportarlo a una base de datos relacional como MySQL, Oracle, Postgres o a un data warehouse.

Sqoop automatiza la mayor parte de sus procesos, confiando en el sistema gestor de bases de datos para obtener una descripción del esquema de los datos que van a ser transferidos. Utiliza MapReduce para importar y exportar datos, lo que proporciona procesamiento en paralelo y tolerancia a fallos.

Para las bases de datos, Sqoop lee fila por fila y las importa en HDFS, la salida de este proceso es un conjunto de ficheros que contienen una copia de la tabla. Se divide en varios fichero al realizarse de forma paralela. Estos ficheros pueden ser .csv, .avro, binarios o de secuencia.

Sqoop proporciona una API Java para poder procesar los datos en el momento de la ingesta. Con esto se pueden programar aplicaciones MapReduce que realicen algún tipo de operación sobre los datos durante su importación.

Sqoop incluye algunos comandos para inspeccionar la base de datos con las que se trabaja. Se pueden listar las bases de datos disponibles  o los esquemas de las tablas. También incluye una shell primitiva para poder enviar comandos o instrucciones SQL.

Muchos de los aspectos de la importación y la exportación de datos pueden ser personalizados. En bases de datos se pueden controlar el rango de filas que se van a importar para realizar una carga incremental. Se pueden especificar los delimitadores utilizados, los caracteres de escape o el formato utilizado.

Sqoop delega todo el procesamiento en Hadoop, cada mapper transfiere una parte de la tabla. El número de mappers que Sqoop utiliza por defecto son 4, aunque es un parámetro configurable.

2. Shell

$ sqoop list-databases \
--connect jdbc:mysql://localhost/ \
--username root

$ sqoop list-tables \
--connect jdbc:mysql://localhost/userdb \
--username root

$ sqoop import (generic-args) (import-args) 
$ sqoop-import (generic-args) (import-args)
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp --m 1

$ sqoop job --create myjob \
--import \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee --m 1

$ sqoop job --list
$ sqoop job --show myjob
$ sqoop job --exec myjob

3. API Java

Gracias a stackoverflow.com por uno de tantos ejemplos.

Import from a table of MySQL to Hadoop.

public static void importSQLToHDFS() throws Exception {
    String driver = "com.mysql.jdbc.Driver";
    Class.forName(driver).newInstance();

    Configuration config = new Configuration(); 
    config.addResource(new Path("/.../conf/core-site.xml"));
    config.addResource(new Path("/.../conf/hdfs-site.xml"));

    properties.load(new FileInputStream("/.../sqoopimport.properties"));

    SqoopOptions options = new SqoopOptions();
    options.setDriverClassName(driver);
    options.setHadoopHome("/.../hadoop-0.20.2-cdh3u2");
    options.setConnectString(properties.getProperty("db_connection_string"));
    options.setTableName(properties.getProperty("db_mysql_table_name"));
    options.setUsername(properties.getProperty("db_usr_id"));
    options.setPassword(properties.getProperty("db_passwd"));
    options.setNumMappers(1);
    options.setTargetDir(properties.getProperty("path_export_file"));
    options.setFileLayout(FileLayout.TextFile);

    new ImportTool().run(options);
}

Export from Hadoop to MySQL:

public static boolean exportHDFSToSQL() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    try {
         SqoopOptions options=new SqoopOptions();
         options.setConnectString("jdbc:mysql://localhost:3306/dbName");
         options.setUsername("user_name");
         options.setPassword("pwd");
         options.setExportDir("path of file to be exported from hdfs");
         options.setTableName("table_name");
         options.setInputFieldsTerminatedBy(',');
         options.setNumMappers(1);
         new ExportTool().run(options);
    } catch (Exception e) {
        return false;
    }
    return true;
}

 

4. Sqoop2

El objetivo de crear Sqoop 2 es hacer más fácil Sqoop y usar una aplicación web para ejecutarlo. Esto permite instalarlo y utilizarlo en cualquier lugar. También tiene una REST API para operaciones y administración, así consigue una mejor integración con sistemas externos como Apache Oozie.

Todavía no tiene implementadas algunas de las funcionalidades de Sqoop por lo que solo se recomienda instalar si es apropiado para resolver algún caso de uso concreto. Por ejemplo todavía no tiene todos los conectores con los principales RDBMS, aunque podríamos utilizar el JDBC, no es lo más óptimo. Tampoco soporta la transferencia de datos entre RDBMS a Hive o HBase.

Fuentes:

Apache Sqoop
Buenas prácticas

 

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