Ticout Outsourcing Center

Explotemos la Tecnología

Ticout Outsourcing Center - Explotemos la Tecnología

Mover datos en Hadoop

1. Introducción

Cuando trabajamos en Hadoop, una de las tareas más habituales que nos encontraremos es mover datos desde sistemas externos a Hadoop y viceversa. El hecho de que los datos, en su organización, sean de diferente tipo y se encuentren en diferentes sitios complica el proceso de mover los datos. ¿Cómo podemos mover los datos desde una base de datos DBMS hacia Hadoop? ¿O cómo podemos mover los diferentes logs que genera mi organización a Hadoop? ¿Cómo devuelvo a mis DBMS la combinación de datos realizada mediante Hadoop y sus procesos MapReduce?

Una forma es mediante programas MapReduce programados por nosotros, esta forma puede llegar a ser costosa, por lo que necesitamos una formas más simple, y es aquí donde Sqoop entra en juego. En este artículo veremos los siguientes puntos:

  1. Instalación de Sqoop.
  2. Mover datos entre MySql y HDFS.
  3. Mover datos entre MySq y Hivetawarehouse.
  4. Mover datos de MySql a Hbase.

En este tutorial hemos usado las siguientes versiones, por lo que si se usan otras versiones puede ser que haya cosas que no funcionen:

  1. Apache Hadoop-1.1.1
  2. Apache Hive-0.9.0
  3. Apache HBase-0.94.5
  4. Apache Sqoop-1.4.3

 

Esquema Hadoop mover datos

 

Muchos de los datos, que tienen las organizaciones, se encuentran en sus sistemas DBMS. El mecanismo clásico para analizar estos datos, suele ser programar una copia de estos datos en un Datawarehouse. Hadoop aparece para jugar dos roles: como sustituto del Datawarehouse (en algunos casos), y como puente entre los datos estructurados, no estructurados y el Datawarehouse.

2. Instalando Sqoop

Sqoop es una herramienta, que nos simplifica el proceso de mover datos desde o hacía sistemas externos a Hadoop. Estos sistemas externos pueden ser ficheros, bases de datos, etc.. Nos permite mover hacia HDFS, Hive y HBase entre otros. Además nos genera las classes Java que representan los datos a usar en procesos MapReduce.

La instalación de Sqoop, no es compleja, descargamos de su web el paquete (Importante: la versión a descargar tiene que ser compatible con nuestra versión de Hadoop) y lo descomprimimos, mediante la instrucción:

 tar xvzf sqoop*.tar.gz
Una vez descomprimido, declaramos las variables de entorno:

  1. HADOOP_COMMON_HOME: donde se encuentra Hadoop
  2. HADOOP_MAPRED_HOME: donde se encuentra hadoop-*-core.jar
  3. HBASE_HOME: ruta donde está HBase
  4. HIVE_HOME: ruta donde está Hive
  5. ZOOCFGDIR: directorio de configuración de Zookeper
  6. SQOOP_HOME: donde se encuentra Sqoop

Puede ser, que ya tengamos algunas de estas variables ya definidas, ya que son usadas por diferentes elementos del ecosistema de Hadoop.  Iniciamos Hadoop y verificamos que Sqoop funcione correctamente, mediante la orden:

sqoop-version
Si todo ha ido bien, nos devolverá la versión de Sqoop que estamos usando.

 

3.  Mover datos entre MySql y HDFS

Entramos a MySql y creamos la base de datos que usaremos, junto con su tabla y unos cuantos registros que insertaremos:

create database sqoop_tut;
use sqoop_tut;
create table empleados(id INT,  nombre VARCHAR(20), PRIMARY KEY id(id));
insert into empleados(id, nombre) values(1, “David”);
insert into empleados(id, nombre) values(2, “Pedro”);
insert into empleados(id, nombre) values(3, “Jose”);
insert into empleados(id, nombre) values(4, “Manuel”);
insert into empleados(id, nombre) values(5, “Ricardo”);

 Verificamos que las inserciones se han hecho correctamente:

 select * from empleados;

 Nos tendría que aparecer los registros que hemos insertado. Vamos a importar esta tabla a HDFS (el sistema de ficheros de Hadoop). Ejecutamos:

sqoop import -connect jdbc:mysql://localhost:3306/sqoop_tut -table empleados -username root -P -target-dir /user/hduser/empleados -m 1
Su sintaxi es:
sqoop import -connect jdbc:mysql://<servidor>:<puerto>/<dbName> -table <NombreTabla> -username <NombreUserDb> -P -target-dir <RutaEnHDFS>

Posiblemente, nos habrá dado un error, esto es debido a que Sqoop no encuentra el driver JDBC de MySql, ya que por razones de licencia no viene incluido. La solución es descargarse el driver JDBC del website de MySql y lo copiamos el driver (.jar)  en la carpeta lib de Sqoop. Una vez hecho esto, podemos repetir la ejecución y ya no debería darnos ningún error (siempre y cuando los parámetros de conexión sean los correctos).

Para verificar si la carga se ha ejecutado correctamente ejecutamos:

hadoop fs -ls <RutaEnHDFS>/empleados

donde RutaEnHDFS es donde le hemos indicado a Sqoop que nos grabe los registros importados desde MySql. En mi caso sería:

hadoop fs -ls /user/hduser/empleados
hadoop -ls

La carga, nos ha creado una carpeta con el nombre de la tabla y en su interior un fichero, podemos mirar el contenido del fichero para ver que realmente se ha cargado correctamente.

hadoop fs -cat /user/hduser/empleados/part*
hadoop -cat

Para mover datos de HDFS a MySql, crearemos una tabla nueva en MySql.

create table empleados_exp(id INT, nombre VARCHAR(20), primary key id(id));
Para exportar a MySql, la sintaxi es la siguiente:
sqoop export -connect jdbc:mysql://<server>:<puerto>/<NombreDb> -table <NombreTabla> -export-dir <RutaEnHDFS> -username <NombreUserDb> -P -m 1
En mi caso sería:
sqoop export -connect jdbc:mysql://localhost:3306/sqoop_tut -table empleados_exp -export-dir /user/hduser/empleados -username root -P -m 1
Si todo ha ido bien, accedemos a MySql y mediante una select sobre la tabla donde hemos exportado deberíamos ver los registros.

select en mysql

 

 4. Mover datos entre MySql a Hive

Hive es el Datawarehouse de Hadoop. Usa un lenguaje SQL llamado HiveQL. Este lenguaje se traduce de forma automática a procesos MapReduce. Verificamos que Hive funciona perfectamente:

 hive
 show tables;

Hive

Nos muestra las tablas que tiene el Datawarehouse. Es importante que la tabla a importar tenga definida una clave primaria. Sqoop al momento de importar consultará la estructura en MySql y creará esa misma estructura en Hive. La sintaxis es:

 sqoop import -connect jdbc:mysql://<Server>:<Puerto>/<NombreDb> -username <NombreUserDb> -P -table <NombreTabla> -hive-import -verbose -m 1
En mi sistema es:
 sqoop import -connect jdbc:mysql://localhost:3306/sqoop_tut -username root -P -table empleados_exp -hive-import -verbose -m 1

Si todo ha ido bien, accedemos a Hive y consultamos las tablas que tiene ahora, vemos que hay una nueva tabla y mediante una select podemos ver su contenido:

Select en Hive

 Las tablas en Hive, quedan almacenadas por defecto, en la siguiente ruta /user/hive/warehouse, lo podemos ver mediante:

 hadoop fs -ls /user/hive/warehouse

Hay una serie de carpetas que se corresponden a cada una de las tablas que tiene almacenadas Hive. Podemos ver también el contenido de las tablas accediendo a estas carpetas y visualizando el contenido de los ficheros:

 hadoop fs -cat /user/hive/warehouse/empleados_exp/part*

Para mover de Hive a MySql, crearemos una nueva tabla, donde guardaremos los registros procedentes de Hive:

create table empleados_exp2(id INT, nombre VARCHAR(20), primary key id(id));
La sintaxis es:
 sqoop export -connect jdbc:mysql://<Server>:<Puerto>/<NombreDb> -table <NombreTabla> -export-dir <RutaTablaEnHive> -username <NombreUser> -P -m 1 -input-fields-terminated-by <CaracterSeparador>
En nuestro ejemplo, la sintaxis sería:
sqoop export -connect jdbc:mysql://localhost:3306/sqoop_tut -table empleados_exp2 -export-dir /user/hive/warehouse/empleados_exp -username root -P -m 1 -input-fields-terminated-by '\001'

 5. Importar de MySql a HBase

HBase es la base de datos NoSql de Hadoop. Está basada en el Google BigTable. Es lo que se conoce como base de datos por columna. El primer paso es iniciar HBase:

start-hbase.sh
La sintaxi para importar de MySql a HBase, es la siguiente:
 sqoop import -hbase-create-table -hbase-table <NombreTablaHBase> -column-family info -hbase-row-key <Clave> -connect jdbc:mysql://<Server>:<Puerto>/<NombreDb> -username <NombreUser> -P -table <TablaNombre> -m 1
Con esta sintaxi, indicamos a Sqoop que nos cree la tabla en HBase.
sqoop import -hbase-create-table -hbase-table Empleados2 -column-family info -hbase-row-key id -connect jdbc:mysql://localhost:3306/sqoop_tut -username root -P -table empleados_exp -m 1

Una vez realizada la carga, accedemos a HBase para verificar que la carga se ha realizado correctamente:

 hbase shell
 list
 scan 'Empleados2'

Veremos todas las tablas que tenemos en HBase y los registros que hay en la tabla Empleados2.

HBase