hadoop-logo sqoop-logo

En esta ocasión veremos como Hadoop además de trabajar con datos no estructurados, también puede hacerlo con datos relacionales para ello Hadoop cuenta con otro componente, SQOOP, es decir, SQL To Hadoop.

Lo que nos  va a permitir Scoop exactamente, es el traspaso de datos entre SQL Azure y Hadoop (HDFS y Hive) en ambos sentidos.

Aunque como siempre, contamos con un tutorial de Microsoft, iremos un poco más allá, concretamente resolveremos algunos problemas encontrados tanto en el tutorial de Microsoft como en otros que podemos encontrar en internet.

1) Como ya disponemos de este tutorial, resumamos como importar una tabla desde SQL Azure hacia Hadoop, hacia HDFS (Hadoop File System):

1) Desde  SQL Server Management Studio, y para cada tabla (ej.: AdventureWorksLTAZ2008R2) de SQL Azure con la que vayamos a trabajar, establecemos un alias o sinónimo. Esto es necesario para que sqoop pueda identificar el nombre de la tabla:

CREATE SYNONYM [SalesLT.Customer] FOR SalesLT.Customer

2) Accedemos mediante terminal server al cluster de Hadoop como ya hemos comentado entre otras cosas en este post.

3) Desde la consola de comandos de Hadoop (Hadoop Command Shell) navegamos hasta la ruta concreta “c:\Apps\dist\sqoop\bin” y ejecutamos la siguiente instrucción para realizar la importación de la tabla SalesLT.Customer al sistema de ficheros de Hadoop (HDFS) concretamente a la ruta /data/customer.

sqoop import

--connect "jdbc:sqlserver://<SQLAZURE-SERVERNAME>.database.windows.net;database=AdventureWorksLTAZ2008R2"

--username jlguerrero@<SQLAZURE-SERVERNAME>

-P

--table SalesLT.Customer

--target-dir /data/Customer

-m 1

Donde: El Parámetro “-P” va a permitirnos introducir por consola el password de conexión a SQL Azure

Importante: La cadena de conexión no esperar recibir el usuario y password, estos se pasan a través de otros parámetros derivados eso sí, de la conexión.

Nota: La instrucción se encuentra dividida en varias líneas pero recordemos que tendrá que encontrase todo en una misma.

image

4) Desde la consola interactiva de Javascript del portal de Hadoop ejeutamos:

  • “#lsr /data”  para verificar que existe una carpeta “Customer” y donde encontraremos nuestro fichero de datos “part-m-00000”.
  • “#tail /data/Customer/part-m-00000” para corroborar que se han cargado datos. Tail nos permitirá visualizar el primer KB del fichero sin necesidad de cargarlo por completo, en cuso caso, podríamos optar por #caten su lugar. 

    Nota: La importación desde una tabla de SQL Server (“OnPremisse”) aún no es posible puesto que las VMs del Cluster de Hadoop además de no tener habilitado los permisos de visibilidad con máquinas On-Premisse, tienen restringidos los permisos para habilitar los mismos, así que por el momento sólo podremos importar datos desde SQL Azure.

2) Veamos a continuación como exportar desde Hadoop (HDFS) hacia SQL Azure:

1) Creamos una nueva tabla “[SalesLT].[CustomerFromHadoop]” en SQL Azure

USE [AdventureWorksLTAZ2008R2]
GO

CREATE TABLE [SalesLT].[CustomerFromHadoop](
    [CustomerID] [int]  NOT NULL,
    [NameStyle] [varchar] (5),
    [Title] [varchar](25) NULL,
    [FirstName] [varchar](50) NOT NULL,
    [MiddleName] [varchar](50) NULL,
    [LastName] [varchar](50) NOT NULL,
    [Suffix] [varchar](25) NULL,
    [CompanyName] [varchar](150) NULL,
    [SalesPerson] [varchar](260) NULL,
    [EmailAddress] [varchar](50) NULL,
    [Phone] [varchar](50) NULL,
    [PasswordHash] [varchar](150) NOT NULL,
    [PasswordSalt] [varchar](50) NOT NULL,
    [rowguid] [varchar] (50) NOT NULL,
    [ModifiedDate] [varchar](50) NOT NULL    
 CONSTRAINT [PK_CustomerHadoop_CustomerID] PRIMARY KEY CLUSTERED  ([CustomerID] ASC
))

GO

 

2) Establecemos su alias para que pueda ser reconocida desde Sqoop.

CREATE SYNONYM [SalesLT.CustomerFromHadoop] FOR SalesLT.CustomerFromHadoop

3) Desde la consola de comandos de Hadoop (Hadoop Command Shell) navegamos hasta la ruta concreta “c:\Apps\dist\sqoop\bin” y ejecutamos la siguiente instrucción:

sqoop export

--connect "jdbc:sqlserver://<SQLAZURE-SERVERNAME>.database.windows.net;database=AdventureWorksLTAZ2008R2"

--username jlguerrero@<SQLAZURE-SERVERNAME>

-P

--table SalesLT.CustomerFromHadoop

--export-dir /data/Customer

--input-fields-terminated-by ","

image

4) Si consultamos nuestra nueva tabla de SQL Azure,  “SELECT * FROM[SalesLT].[CustomerFromHadoop]”, podremos comprobar como se ha cargado correctamente con todos sus datos.

Nota: En este caso de exportación desde Hadoop, el proceso podría complicarse si pretendemos hacer transformaciones de campos, en tal caso, el camino será más fácil si estas transformaciones las llevamos a cabo en SQL directamente una vez realizada la exportación.

Espero haber aclarado un poco más el camino hacia y desde Hadoop HDFS hacia SQL Azure. En el próximo capitulo de Sqoop, veremos como importar datos directamente hacia Hive.

Saludos @Home

Juanlu,ElGuerre