viernes, mayo 30, 2014

Logística de datos con Apache Sqoop: Importando bases de datos al HDFS

Exportando BBDD SQL con Apache Sqoop


cd $HOME
wget http://apache.rediris.es/sqoop/1.4.4/sqoop-1.4.4.bin__hadoop-0.23.tar.gz
tar -zxvf sqoop-1.4.4.bin__hadoop-0.23.tar.gz
Vamos a crear una tabla en MySQL muy básica que se llame "sqoop-table" que contenga ID y un nombre de usuario simplemente dentro de la DDBB "sqoop-test"

CREATE TABLE `sqoop-table` ( id int NOT NULL, name varchar(255) NOT NULL, PRIMARY KEY (id) );
INSERT INTO `sqoop-table` VALUES (1, "mario");
INSERT INTO `sqoop-table` VALUES (2, "caster");
+------+-------+
| id   | name  |
+------+-------+
| 1    | mario |
| 2    | caster|
+------+-------+


Un problema que nos podemos encontrar hoy dia es que la instalación de Sqoop no incluya el driver jdbc de mysql ya que este fue sacado de la carpeta "lib" para poder mantener el proyecto con licencia Apache. El driver, se encuentra en "/usr/share/java/mysql-connector-java" así que simplemente vamos a hacer un link a dicha libreria con el comando "ln" desde la carpeta de Sqoop:

ln -s /usr/share/java/mysql-connector-java.jar lib/


Ya estamos listos, lo que vamos a hacer es importar la tabla con valores por defecto de Sqoop, esto nos va a generar un archivo por cada mapper con una linea por fila y con los valores separados por comas. Para simplificarlo vamos a usar un único mapper:

bin/sqoop import --connect jdbc:mysql://localhost/sqoop-test --table sqoop-table -m 1 --username root --password mypass


Vamos a explicar paso a paso la siguiente ejecución:

  1. Llamamos a la orden import ya que es la acción que queremos realizar
  2. --connect jdbc:mysql://localhost/sqoop-test Le decimos cómo encontrar nuestra base de datos: usando el driver JDBC de MySQL para Java y le pasamos la URI de la BBDD
  3. Le indicamos que tabla queremos usar de la BBDD: --table sqoop-table
  4. -m 1: Se le indica el número de Mappers a usar. Con un único mapper tendremos un único output y, ya que el script no va a usar reducers, también nos generará un único archivo.
  5. --username root: Lo normal es tener acceso restringido a la BBDD así que le pasamos las credenciales de acceso, en nuestro caso es root.
  6. --password mypass: Y le pasamos la pass para acceder a la BBDD.
Tras ejecutar la orden, un jar de MapReduce se generará y ejecutará de la manera habitual en la consola. El chorreo de logs debería ser conocido ya a estas alturas:
INFO mapred.JobClient: Running job: job_201405291246_0003
INFO mapred.JobClient:  map 0% reduce 0%
INFO mapred.JobClient:  map 100% reduce 0%
INFO mapred.JobClient: Job complete: job_201405291246_0003


Bien, nuestra tabla ya se encuentra en el HDFS en un único fichero en formato csv. Vamos a ver su contenido:

hadoop fs -ls /user/mariocaster
drwxr-xr-x   - mariocaster supergroup          0 2014-05-29 13:31 /user/mariocaster/sqoop-table

hadoop fs -ls /user/mariocaster/sqoop-table
-rw-r--r--   2 mariocaster supergroup          0 2014-05-29 15:23 /user/MaC/sqoop-table/_SUCCESS
drwxr-xr-x   - mariocaster supergroup          0 2014-05-29 15:22 /user/MaC/sqoop-table/_logs
-rw-r--r--   2 mariocaster supergroup         17 2014-05-29 15:22 /user/MaC/sqoop-table/part-m-00000

hadoop fs -cat /user/mariocaster/sqoop-table/part-m-00000
1,mario
2,caster


Como podéis apreciar, ya tenemos el contenido de nuestra base de datos como un fichero dentro del HDSF. Esperemos que hayáis disfrutado del tutorial. El siguiente tutorial sobre Sqoop será cómo exportar datos desde el HDFS a una MySQL. ¡Saludos!

0 comentarios:

Publicar un comentario