miércoles, 10 de octubre de 2012

Windows Azure Hadoop. Understanding, Diving and Solving issues II (HiveQL)

hive_logo_mediumMuy buenas,

Siguiendo con Hadoop, veamos que es HiveQL y cómo utilizarlo.

Big Data y, como decíamos, “Hadoop On Azure”, contiene muchos componentes, en el post anterior, comentamos y trabajamos sobre uno de ellos, concretamente sobre “C# Streaming”.  En este caso, otro de estos es Hive QL:

¿Que nos dice Wikipedia?

Apache Hive es un data warehouse construida en la base de Hadoop a fin de proporcionar resumenes de datos, consultas y análisis. Aunque inicialmente desarrollado por Facebook, Apache Hive está utilizado y desarrollado por otras empresas como Netflix.  Hive también se incluye en “Amazon Elastic MapReduce” en Amazon Web Services.

Aunque está basado en SQL, HiveQL no sigue estrictamente el estandar SQL-92. HiveQL ofrece extensiones que no están en SQL, incluyendo:

  1. Inserciones multitable y “create table” como “select”
  2. Sólo ofrece soporte básico para índices.
  3. Carece de soporte para transacciones y “vistas materializadas”, y sólo soporta un conjuto limitado limitado queries.

Internamente, un compilador traduce las instrucciones HiveQL en un gráfico acíclico dirigido de jobs MapReduce, que son enviados a Hadoop para su ejecución.

Entendido que es HiveQL y partiendo del ejemplo del post anterior, nuestra intención, en este caso/ejemplo, es poder utilizar estas consultas SQL para explotar toda la información a nuestro antojo. Para ello, y como ya tenemos configurado Hadoop para trabajar con el Storage de Azure:

1) Accedemos a la consola de HiveQL a través del portal de Hadoop:

imageimage

2) Introducimos la siguiente “query” que nos va a permitir crear una tabla y cargar en ella el contenido de nuestro fichero.

CREATE EXTERNAL TABLE iislog (num INT,  url STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED by ‘32’
STORED AS TEXTFILE
LOCATION 'asv://fivetopuriresults/results.txt/part-00000';



image


donde: ‘32’ es el carácter ASCII correspondiente al espacio. Indicando esto que el fichero de texto se cargará en la tabla separando los campos por este carácter.


3) Comprobamos que nuestra tabla se ha creado correctamente; bien desde la consola de Hive o, bien usando la query “show tables;”:


image image


4) Comprobamos que los datos se han cargado correctamente usando la query “select * from iislog;


image


5) Con la tabla ya cargada, sólo nos queda comenzar a realizar las queries, por ejemplo:


SELECT url FROM iislog
WHERE num = '8';


Algunas otras instrucciones son:



  • drop iislog; para borrar
  • --, para comentarios 

Nota: Es muy importante que la ruta del fichero de Azure Storae (“asv://” ) sea correcta puesto que en caso contrario la creación de la tabla no provocará un error. Debemos te tener en cuenta también que tanto esta ruta como cualquier otra (HDFS://) es “key sensitive”.


Para más información sobre queries en HiveQL podemos ver este tutorial.


En el siguiente post, veremos como consumir estos datos de una forma mucho más amigable, Excel, Power Pivot y Power View, nos ayudarán en esta labor.


Saludos and happy HiveQL !!
Juanlu, ElGuerre

Etiquetas: , ,


domingo, 7 de octubre de 2012

Windows Azure Hadoop. Understanding, Diving and Solving issues

hadoop-logoMuy buenas,

Esta semana he estado “pegándome” un poco con Hadoop, ¡se acercan bonitos tiempos! y, aunque aún tengo pendiente un par de post sobre HPC, tendrán que esperar por el momento.

Cuando hablamos de Hadoop, también hablamos de Big Data, (¡si, efectivamente, muchos datos y muy grandes !), ambos términos están relacionados. Concretamente, Big data, se refiere a conjuntos de datos que crecen tan enormemente que son difíciles de capturar, almacenar, gestionar, analizar, visualizar y compartir con las herramientas de bases de datos más comunes de hoy día. Teniendo en cuenta esto, existe tres características que definen a Big Data muy bien:

  1. Volumen: Terabytes y Petabytes de información
  2. Velocidad: Clusters dedicados a la ejecución de tareas/jobs y, un algoritmo: MapReduce, también muy utilizado en HPC.
  3. Variedad: Texto, BBDD, redes sociales, etc

Por otro lado, Wikepedia nos dice:

Apache Hadoop es un framework de software que soporta aplicaciones distribuidas bajo una licencia libre. Permite a las aplicaciones trabajar con miles de nodos y petabytes de datos. Hadoop se inspiró en los documentos Google para MapReduce y Google File System (GFS).

Hadoop es un proyecto de alto nivel Apache que está siendo construido y usado por una comunidad global de contribuidores, mediante el lenguaje de programación Java. Yahoo! ha sido el mayor contribuidor al proyecto, y usa Hadoop extensivamente en su negocio.

Y si queremos un poco más de detalle antes de ponernos manos a la obra, nuestro compañero Ibon Landa, nos cuenta más en este post (Big Data, Hadoop y Windwos Azure).

Para comenzar, una vez más contamos con los tutoriales de Microsoft y que por supuesto, no vamos a pasar por alto, si no que los aprovecharemos para profundizar, en concreto, pariremos de este (Hadoop on Windows Azure - Working With Data), donde veremos como procesar un fichero de log de IIS pudiendo explotar toda la información del mismo muy fácilmente, utilizando además, el Storage de Azure. Para ello:

  1. Podemos optar bien por crear un WebRole como nos dice el ejemplo para navegar y obtener el log o, simplemente partir de un fichero de logs IIS cualquiera ya existente.
  2. Creamos un programa de Consola en C#, que será la función “MAP” del algoritmo y cuya finalidad es:
    • Obtener las urls (que comiencen por “http://” o terminen por “.aspx” o “.html”).
  3. Creamos un programa de Consola en C#, función “REDUCE” y cuya finalidad será:
    • A partir de la información proporcionada por el MAP, obtener el número de veces que aparece cada url.
    • Ordenar la lista descendentemente

Importante: Cuando trabajamos con Hadoop On Azure con C# (Streaming), siempre tenemos que incluir la siguiente línea de código al comienzo de nuestra aplicación consola MAP y REDUCE:

if (args.Length > 0)
{
Console.SetIn(new StreamReader(args[0]));
}


Una vez tengamos nuestros ficheros “Map.exe” y “Reduce.exe” y un fichero de logs de IIS cualquiera procedemos a cargar los datos en Hadoop:


1) Desde la consola Interactiva de Javascript subimos los ficheros a HDFS (Hadoop File System).



js> fs.put()


image


Donde en, Destination, introduciremos el valor “/example/apps/map.exe”.  Es importante tener en cuenta el comienzo de este valor, puesto que no es lo mismo “/example/…” que “./example/…”. En este último caso, al acceder al fichero tendremos que indicar la ruta completa desde el root, es decir, “/users/juanluelguerre/examples/apps/map.exe”.


De la misma manera lo haremos para Reduce.exe.


2) Utilizando “Azure Storage Explorer”, conectamos con el Storage de Azure y subir el fichero de log de IIS a un container denominado “fivetopuri”. Adicionlamente crear otro container para los resultados, denominado “fivetopuriresults”


image


3) Configurar Hadoop para que pueda trabajar con el Storage de Azure.


image imageimage


4) Creamos un Job con la siguiente información:




Hadoop jar hadoop-streaming-1.0.3.jar -files "hdfs:///example/apps/map.exe,hdfs:///example/apps/reduce.exe" -input "asv://fivetopuri/iislog.txt" -output "asv://fivetopuriresults/results.txt" -mapper "map.exe" -reducer "reduce.exe"


Nota: ASV: indica una ruta del Storage de Azure.


5) Ejecutamos el Job y esperamos.


Si hemos seguido el ejemplo tal cual, probablemente encontraremos algunos errores:




1) En primer lugar identificaremos el  JobId, que se encontrará “…in progress” o “RUNNING”:



image




  • Una vez hemos el “JobId”, nos conectamos al cluster mediante Remote Desktop y abrimos la consola de Hadoop (“Hadoop command Shell”):

imageimage



  • Ejecutamos la siguiente línea de comando, obteniendo un resultado indicando que el Job ha sido eliminado.

c:\apps\dist>hadoop job -kill job_201210061842_0019
Killed job job_201210061842_0019


Después de muchos intentos continuaremos el problema hasta que lo resolvamos.  En nuestro ejemplo tendremos que hacer una modificación, es decir, cambiar el caracter “\t” por cualquier otro,  por ejemplo “-”, de manera que la función “Map” queda así:


private const char SEPARATOR = '-';

Console.WriteLine(string.Format("{0}{1}{2}", uri, SEPARATOR, counters[uri]));


Y la función “Reduce” así:


private const char SEPARATOR = '-';
...

string line;
while ((line = Console.ReadLine()) != null)
{
// parse the uri and the number of request
var values = line.Split(SEPARATOR);
string uri = values[0];
int numOfRequests = int.Parse(values[1]);

// save the max number of requests for each uri in UriCounters
if (!UriCounters.ContainsKey(uri))
UriCounters.Add(uri, numOfRequests);
else if (UriCounters[uri] < numOfRequests)
UriCounters[uri] = numOfRequests;
}


6) Volvemos al punto 1) y eliminamos el contenido del container “fivetopuriresult” del  storage de Azure.


7) Ejecutamos nuevamente el Job. Y ahora sí:



12/10/07 17:16:18 INFO mapred.FileInputFormat: Total input paths to process : 1
12/10/07 17:16:19 INFO streaming.StreamJob: getLocalDirs(): [/hdfs/mapred/local]
12/10/07 17:16:19 INFO streaming.StreamJob: Running job: job_201210071446_0030
12/10/07 17:16:19 INFO streaming.StreamJob: To kill this job, run:
12/10/07 17:16:19 INFO streaming.StreamJob: c:\Apps\dist/bin/hadoop job -Dmapred.job.tracker=10.26.110.33:9010 -kill job_201210071446_0030
12/10/07 17:16:19 INFO streaming.StreamJob: Tracking URL: http://10.26.110.33:50030/jobdetails.jsp?jobid=job_201210071446_0030
12/10/07 17:16:20 INFO streaming.StreamJob: map 0% reduce 0%
12/10/07 17:16:47 INFO streaming.StreamJob: map 50% reduce 0%
12/10/07 17:16:50 INFO streaming.StreamJob: map 100% reduce 0%
12/10/07 17:16:56 INFO streaming.StreamJob: map 100% reduce 33%
12/10/07 17:17:08 INFO streaming.StreamJob: map 100% reduce 100%
12/10/07 17:17:21 INFO streaming.StreamJob: Job complete: job_201210071446_0030
12/10/07 17:17:21 INFO streaming.StreamJob: Output: asv://fivetopuriresults/results.txt



image


A partir de aquí sólo nos queda complicar las funciones “Map” y “Reduce” tanto como queramos para explotar mucha más información.


En los siguientes post veremos como manejar toda esta información con “Hive” (Datawarehouse de Hadoop) y “Exel”.


Saludos @WorkingRoom
Juanlu, ElGuerre

Etiquetas: ,


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