martes, 23 de octubre de 2012

Windows Azure Hadoop. Understanding, Diving & Solving issues IV. SQL To Hadoop (Sqoop) II

 

 hive_logo_mediumsqoop-logo

En el capítulo anterior de Sqoop, veíamos como llevar a cabo una importación y exportación de datos desde SQL Azure hacia y desde Hadoop, concretamente desde y hacia su sistema de ficheros HDFS. Pues bien, en esta ocasión, veremos como conseguir esta importación directamente hacia Hive.

1) Importación de datos desde SQL Azure hacia Hive:

1) Creamos una vez más el alias para que Sqoop entienda la tabla, sin embargo, en este caso, no puede tener ningún “punto”, en cuyo caso Sqoop no será capaz de crear la tabla en Hive.

CREATE SYNONYM [hivecustomer] FOR SalesLT.Customer

2) Ejecutamos la siguiente instrucción:



sqoop import
--connect "jdbc:sqlserver://<SQLZAURE-SERVERNAME>.database.windows.net;database=AdventureWorksLTAZ2008R2"
--username  jlguerrero@<SQLZAURE-SERVERNAME>
-P
--table hivecustomer
--hive-import
--hive-overwrite
-m 1

Donde:



  • -–hive-import, permite la importación directamente hacia Hive. En caso de que la tabla “hivecustomer” no exista esta será creada.
  • --hive-overwrite, sobreescribe la tabla “hivecustomer” si ya existe en  Hive.

image


3) Desde la consola de Hive podremos comprobar que se ha creado la tabla “hivecustomer” y se han cargado todo los datos: “select * from hivecustomer;


Nota: Para más detalle sobre Sqoop, siempre podemos consultar la guía de usuario, http://sqoop.apache.org/docs/1.4.0-incubating/SqoopUserGuide.html, donde podremos profundizar todo cuanto queramos.


En el post anterior comentaba que este nuevo capítulo íbamos a ver la exportación desde Hive hacia SQL Azure, no obstante, rectifico, puesto que en dicho sentido la exportación, a día de hoy aún no es posible. Perdonad, actualizo el post debidamente.


Hasta aquí y tras unos cuantos posts, ya tenemos toda la información que necesitamos en Hive. Obtenida desde SQL Azure, de Azure Storage según comentamos en este post (HiveQL), y  desde HDFS, sólo nos queda comenzar a explotar la misma como si de un único repositorio se tratara. Eso sí, esto será en un nuevo capítulo, por el momento continuaremos conociendo otros componentes de Hadoop On Azure.


Aunque este post ha sido algo más corto que de costumbre, espero que no menos interesante.


Saludos
Juan Luis Guerrero

Etiquetas: , , ,


domingo, 21 de octubre de 2012

Windows Azure Hadoop. Understanding, Diving & Solving issues IV. SQL To Hadoop (Sqoop) I

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 #cat en 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

    Etiquetas: , ,


    This page is powered by Blogger. Isn't yours?