Manejo Apache Sqoop
Una vez instalado Apache Sqoop, llegamos al punto de la práctica el post de manejo de Apache Hive se ha pospuesto por que necesitamos información para empezar a navegar entre la estructura de lo que implica Apache Hive, y como primer paso, empezaremos a exportar información de una RDBMS para este caso utilizaré MySQL, pero si alguno de ustedes tiene una Base de Datos Oracle, SQL Server, Informix etc, les indicaré que paso cambiaría para que funcione con una Base Distinta a la que usaré para este ejemplo.
Para empezar necesitamos tener instalado MySQL en alguna máquina y que pueda ser visible para la máquina o clúster que tenga instalado sqoop.
Para esto, encontré una página que provee una Base de Datos para MySQL en el siguiente link: http://www.mysqltutorial.org/mysql-sample-database.aspx cargamos esta Base de Datos en nuestra MySQL.
Una vez cargada en nuestro MySQL podemos ver con un cliente, en este caso Workbench nuestra Base de Datos y las tablas dentro de ella en el recuadro verde.
Ahora que ya contamos con información en una RDBMS podemos usar sqoop para extraer información de esta Base de Datos y llevarla a HDFS.
Un comando básico para importar información a HDFS desde una Base de Datos sería con el siguiente:

Como podemos ver, sqoop nos arroja una excepción que dice "Could not load db driver class: com.mysql.jdbc.Driver" para solucionar este error, debemos descargar el jdbc correspondiente a nuestra RDBMS en este caso descargaré el de MySQL. Dependiendo de la RDBMS deberá descargarse el jdbc correspondiente.

Como podemos ver en el recuadro rojo se encuentra el jdbc o driver correspondiente a un RDBMS MySQL, procedemos a moverlo a la carpeta lib/ correspondiente a la carpeta de sqoop/ entonces con el siguiente comando movemos el driver a donde sqoop lo va a buscar.
mv mysql-connector-java-5.1.42-bin.jar /usr/local/sqoop/lib/

Una vez que hayamos movido este driver a la carpeta lib de hadoop, procedemos a ejecutar el comando de sqoop previamente ejecutado.

Podemos ver en verde el comando de sqoop previamente ejecutado y en rojo el resultado del comando, que son las tablas correspondientes a la Base de Datos que estamos usando.
A continuación extraeré la tabla customers y employees de mysql y los dejaré en un directorio de HDFS.
La tabla contiene el siguiente número de registros en la RDBMS.

Y contiene la siguiente información.

El comando para extraer esta información sería:

Al ejecutar el comando podremos ver lo siguiente en consola.


Una vez terminado el comando, podemos verificar en HDFS que ya existe una carpeta llamada /usr/sqoop/customers-import que contendrá un archivo llamado part-m-00000, que en la parte de teoría de MapReduce explique por que esta notación.

Una vez que corroboramos que el archivo ya existe en HDFS, procederé a descargarlo al File System Local para checar su contenido.

Una vez descargado el archivo checamos nuestro File System Local en busca del part-m-00000.

Por último checamos el contenido de este archivo.

Como podemos observar el archivo contiene la misma información que en la Base de Datos, la diferencia es que aquí ya vive en HDFS.
Ahora procederé a explicar cada parte del comando anterior:
sqoop import --connect jdbc:mysql://192.168.100.19/classicmodels --username root -password welcome1 --table customers -m 1 --class-name customers
--target-dir /usr/sqoop/customers-import --bindir .

Una vez que el comando termine su ejecución, tendremos información en Apache Hive que hemos instalado previamente.
Con Sqoop exportamos de MySQL a Apache Hive la tabla llamada employees como podemos ver en la siguiente imagen.

Ahora ya contamos con información en nuestra instancia de Apache Hive.
Ahora explicaré dos parámetros que difieren al primer import que realice.
Para empezar necesitamos tener instalado MySQL en alguna máquina y que pueda ser visible para la máquina o clúster que tenga instalado sqoop.
Para esto, encontré una página que provee una Base de Datos para MySQL en el siguiente link: http://www.mysqltutorial.org/mysql-sample-database.aspx cargamos esta Base de Datos en nuestra MySQL.
Ahora que ya contamos con información en una RDBMS podemos usar sqoop para extraer información de esta Base de Datos y llevarla a HDFS.
Un comando básico para importar información a HDFS desde una Base de Datos sería con el siguiente:

Como podemos ver, sqoop nos arroja una excepción que dice "Could not load db driver class: com.mysql.jdbc.Driver" para solucionar este error, debemos descargar el jdbc correspondiente a nuestra RDBMS en este caso descargaré el de MySQL. Dependiendo de la RDBMS deberá descargarse el jdbc correspondiente.

Como podemos ver en el recuadro rojo se encuentra el jdbc o driver correspondiente a un RDBMS MySQL, procedemos a moverlo a la carpeta lib/ correspondiente a la carpeta de sqoop/ entonces con el siguiente comando movemos el driver a donde sqoop lo va a buscar.
mv mysql-connector-java-5.1.42-bin.jar /usr/local/sqoop/lib/

Una vez que hayamos movido este driver a la carpeta lib de hadoop, procedemos a ejecutar el comando de sqoop previamente ejecutado.

Podemos ver en verde el comando de sqoop previamente ejecutado y en rojo el resultado del comando, que son las tablas correspondientes a la Base de Datos que estamos usando.
A continuación extraeré la tabla customers y employees de mysql y los dejaré en un directorio de HDFS.
La tabla contiene el siguiente número de registros en la RDBMS.

Y contiene la siguiente información.

El comando para extraer esta información sería:

Al ejecutar el comando podremos ver lo siguiente en consola.


Una vez terminado el comando, podemos verificar en HDFS que ya existe una carpeta llamada /usr/sqoop/customers-import que contendrá un archivo llamado part-m-00000, que en la parte de teoría de MapReduce explique por que esta notación.

Una vez que corroboramos que el archivo ya existe en HDFS, procederé a descargarlo al File System Local para checar su contenido.

Una vez descargado el archivo checamos nuestro File System Local en busca del part-m-00000.

Por último checamos el contenido de este archivo.

Como podemos observar el archivo contiene la misma información que en la Base de Datos, la diferencia es que aquí ya vive en HDFS.
Ahora procederé a explicar cada parte del comando anterior:
sqoop import --connect jdbc:mysql://192.168.100.19/classicmodels --username root -password welcome1 --table customers -m 1 --class-name customers
--target-dir /usr/sqoop/customers-import --bindir .
- sqoop: Comando reservado para mandar a llamar un Job llamado sqoop.
- import: Primer parametro, que hace mención a que la función de este Job será de importación a HDFS.
- --connect: Url en formato Java, que lleva la información como el host, puerto, base de datos y tipo de base de datos.
- --username: Nombre del usuario para conectarse a la base de datos.
- --password: Password del usuario para conectarse a la base de datos.
- --target-dir: Dirección o ruta en HDFS donde se guardará la información extraída de la tabla en la base de datos.
- --class-name: Nombre del código generado por sqoop para realizar la importación o exportación.
- -m ó --num-mappers: Número de mappers para hacer la importación en paralelo, si no usamos este parámetro por default sqoop toma un valor de 4 mappers.
- --bindir: Dirección o ruta en el File System Local donde se depositará el código generado y el compilado del comando sqoop para realizar el macheo de tipos de datos. Sin este parámetro sqoop depositará los archivos anteriores en /tmp/sqoop-
/compile.
Ahora que ya sabemos importar datos de una RDBMS a HDFS.
Ahora realicemos lo mismo, pero para que nos importe una tabla en MySQL a Hive y no a HDFS, aunque el archivo anterior que exportamos a HDFS nos servirá para el post de Manejo Apache Hive.
Ahora, procederemos a importar una tabla diferente de MySQL a Apache Hive, con el siguiente comando.

Antes de ejecutar este comando en la consola, procederemos a corroborar que nuestra Instancia de Apache Hive no contiene ninguna tabla.

Como podemos ver, nuestra instancia aún no contiene nada de información, ahora si procedemos a ejecutar el comando de sqoop anterior.
El cuál nos dará como resultado las siguientes pantallas.

Ahora, procederemos a importar una tabla diferente de MySQL a Apache Hive, con el siguiente comando.

Antes de ejecutar este comando en la consola, procederemos a corroborar que nuestra Instancia de Apache Hive no contiene ninguna tabla.

Como podemos ver, nuestra instancia aún no contiene nada de información, ahora si procedemos a ejecutar el comando de sqoop anterior.
El cuál nos dará como resultado las siguientes pantallas.


Una vez que el comando termine su ejecución, tendremos información en Apache Hive que hemos instalado previamente.
Con Sqoop exportamos de MySQL a Apache Hive la tabla llamada employees como podemos ver en la siguiente imagen.

Ahora ya contamos con información en nuestra instancia de Apache Hive.
Ahora explicaré dos parámetros que difieren al primer import que realice.
- --null-string '\\N': Cuando exportamos con Sqoop, tenemos un problema, que los elementos que tienen como valor el carácter nulo, si no usamos este parámetro, Apache Hive toma null como String y no como tal el carácter nulo, este es para columnas String, esta su análogo para columnas del tipo No String (--null-non-string).
- --hive-import: Este parámetro sustituye el otro parámetro --target-dir que usamos en el ejemplo anterior el cual hacia mención a que la información extraída de el RDBMS, la depositaría en HDFS, con este parámetro le decimos que las deposite en la estructura de almacenamiento de Apache Hive.
A manera de conclusión, sqoop es una herramienta muy útil de extracción de información a el ambiente distribuido de Hadoop, pero así mismo es bueno para importar datos a cualquier RDBMS cuando la información se encuentra en HDFS, sqoop es el puente perfecto entre estas dos tecnologías, aunque también Spark nos brinda un puente como sqoop, pero eso más adelante lo descubriremos.
Comentarios
Publicar un comentario