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

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:Appsdistsqoopbin” 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:Appsdistsqoopbin” 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

    Windows Azure Hadoop. Understanding, Diving & Solving issues III (Consumiendo Hive desde Excel, Power Pivot y Power View)

    hive_logo_medium

     

    Muy buenas,

    Continuado con Hadoop on Windows Azure y tras los dos post anteriores: “Understanding, Diving And Solving issues” y “Understanding, Diving and Solving Issues II (HiveQL)”, seguiremos con el ejemplo a partir de la Tabla “iislog” creada en HiveQL.

    Una vez creada y cargada la tabla con la información del fichero de texto almacenado previamente, veremos como podemos tratar la información desde Excel, Power Pivot y/o Power View, donde para ello seguiremos los siguientes pasos:

     

    1) Habilitamos la comunicación desde Hadoop para poder conectarnos vía ODBC desde Excel.

    image image

    2)Descargamos el “.msi” de instalación del ODBC desde el portal de hadoop y lo instalamos.

    image_thumb10  image_thumb9

    3) Configuramos la conexión del ODBC de Hive con Hadoop.

    imageimage

    4) Abrimos Excel 2010  o 2013 Preview y revisamos que nuestro nuevo Add-In se encuentra habilitado al igual que el de Power View. Para el caso de Excel 2010, descargaremos “Power Pivot” desde aquí. Para 2013 Preview, no es necesario, bastará simplemente con habilitarlo.

    image

    5) Accedemos al menú DATA y, concretamente, al ribbon “Hive Pane” el cual nos mostrará el Tool Box “Hive Query” y donde seleccionaremos la conexión creada en el paso 3.

    image  image image_thumb13

    6) Seleccionamos la tabla “iislog
    image image
    7) Navegamos a POWER PIVOT  - “Manage” y a continuación elegimos “Existing Connections…”
    imageimage
    7.a) En este punto obtendremos un error del tipo, “SQL_ERROR Query preparation failed. Username/password is invalid: <jlguerrero>/<>”. Donde por algún motivo el passord no se incluye en la conexión ni tampoco hay posibilidad para ello.
    image
    7.b) Optamos por “From Other Sources… – Others (OLEDBODBC)” e introducimos el siguiente “Connection String”:
    “Provider=MSDASQL.1;Dsn=My First Hadoop;uid=jlguerrero;password=xxxxxx”

    8) Seguimos los pasos de Wizard y en esta ocasión todo es correcto. ¡Esperemos que se trate de bug del Hive para Excel o incluso de Office 2013 Preview, como es mi caso!

    image

    8) A partir de aquí, Power Pivot hará el resto del trabajo. Para obtener el siguiente gráfico, en poco más de 1minuto, echemos un vistazo a este vídeo.
    image
    Aunque la información con la que hemos estado trabajando en el ejemplo, no es “mucha”, ni “grande”, es suficiente a modo de ejemplo para demostrar como trabajar con Hive.  Si extrapolamos todo este proceso para un conjunto mayor de información, para información de los más variopinta y de distintos repositorios/fuentes y las juntamos todas en Hive, estaremos visualizando hasta donde puede llegar Hadoop.
    Power Pivot, también permite la conexión directa con SQL Azure  y otras muchas fuentes, así que con Hive lo haremos sólo cuando sea realmente necesario. ¡No todo tiene que ser ahora Hadoop!
    Os dejo también un enlace bastante interesante relacionado con el tema: Processing Azure Storage analytics logs with Hadoop on Azure.

    Saludos y nos vemos en el siguiente capitulo de Hadoop
    Juanlu, ElGuerre

    Nokia Lumia no carga, “Restoration Error”!!. ¿Esta muerto?. “Nokia Care Suite”, lo resucita!

    WP7_Logo

    Muy buenas,

    No puedo pasar por alto la solución al problema que acabo de tener con el Nokia Lumia 800, concretamente el miércoles pasado, y que, me ha traído de cabeza algún que otro rato.  Tras buscar por internet he encontrado varias soluciones posibles, pero ninguna fructífera, además, por si fuera poco he podido ver el mismo problema a muchos usuarios y sin solución, ¡es normal ver como muchos nos desesperamos al pensar que nuestro teléfono se muere y sin poder hacer nada, bueno, la última opción es el servicio técnico!

    Voy a intentar detallar paso a paso tanto mi problema como la solución e intentar aportar un poco de luz y evitar alguna que otra desesperación.

    El problema comienza el miércoles por la noche, cuando de repente el teléfono se apaga debido a que la batería se agota, ¡suele pasarle a cualquier teléfono, hasta aquí, todo es normal!, la cuestión es que al despertarme por la mañana tras haberlo dejado cargando durante toda la noche me encuentro la pantalla en negro con el logotipo de “NOKIA” en la misma, ¡así, sin más!. Tras varios intentos de, encender, apagar, encender, etc., el teléfono no responde.

    Parece que se trata de un problema de batería, ¡es como si no pudiera conseguir el voltaje adecuado para iniciar el sistema!

    • Intento la conbinación de teclas (Volume Key Dowm + Power Key) para no perder los datos del teléfono y todo sigue igual.
    • Finalmente me decido por un “Hard Reset” (Volume Key Down + Camera key + Power key) teniendo en cuenta que perdería los datos y, nada de nada.
    • Lo conecto a Zune y nada de nada, este no lo detecta.
    • Intento seguir alguno de estos pasos: http://support.microsoft.com/kb/2484484 y tampoco, eso si, consigo aprender que al dejar pulsado el botón de la cámara mientras lo conecto al USB, Zune me indica este error, “RESTORATION ERROR, An error prevented the restoration of your phone to its previous versión”:

    image

    • Nada, cierro, vuelvo a conectar, etc. y nada, sigo con el mismo problema.
    • Dejo el teléfono un par de días apagado, para ver si se agota la batería al 100% y reacciona al cargarlo de nuevo, pero nada, sigue sin funcionar.
    • En algún foro he llegado a ver como más de uno intenta proporcionar calor para conseguir que la batería consiga arrancar, ¡eso no lo he intentado, ni tenía empeño, jejeje…!

    La Solución

    Llegado este punto, y si hemos intentado todo, ya no podremos recuperar los datos del teléfono, pero eso si, podremos revivirlo y poder volver a utilizarlo nuevamente.

    Retomemos la herramienta de Nokia, “Nokia Care Suite”, la que además de permitirnos la actualización previamente a la salida oficial de un firmware, o una actualización de Windows Phone, tal y como ya comenté en alguna ocasión, aquí, además, nos va a permitir recuperar el sistema tras cualquier tipo de fallo, sea cual sea el mismo.  Veamos estos pasos:

    1) Descargamos la versión y la actualizamos, concretamente la última versión es la 5.0.0 (2012.40.5)

    image

    2) Instalamos la misma.

    3) Accedemos a la ruta, “C:Program Files (x86)NokiaNokia Care SuiteDrivers” he instalamos “WinUSB DriversX64.msi” o “WinUSB DriversX86.msi”. Adicionalmente, yo he instalado también; “Nokia 3806 USB DRIVIER ver1.5.exe” y “Nokia_Mobile_Phone_Driver_V2.00.10.msi”. Esto nos va a permitir conectar nuestro Teléfono con el ordenador a través del USB incluso a pesar de que no se inicie Windwos Phone.

    image

    4) File –> “Open Product” y buscamos nuestro teléfono.

    image

    5) Buscamos el nuestro modelo concreto de Nokia a través del botón “Find Online…” e introduciendo el “Code” o el “Variant Name” para poder identificarlo más rápidamente.

    image

    6) Una vez identifiquemos nuestro modelo de teléfono descargamos pulsamos sobre “Download” y comienza la descarga del software del mismo.  Generalmente se descargará en esta ruta por defecto: “C:ProgramDataNokiaPackagesProductsrm-801”

    image

    7) Finalizada la descarga, desconectamos todos los USB que tengamos conectados al PC, el del ratón, no es necesario, ¡no al menos en mi caso!.

    8) Establecemos el modo de conexión a “Offline”:

    imageimage

    8) Desconectamos el teléfono si estuviera conectado y lo apagamos dejando pulsado el botón “Power” durante unos 10 segundo o más si fuera necesario hasta conseguir que no se vuelva a encender automáticamente.

    9) A continuación, dejando pulsado el botón de Subir volumen (Volumen Up) conectamos el teléfono al PC a través del cable de USB hasta que se produzca una pequeña vibración.

    10) Accedemos a la opción “Recovery” que podemos encontrar en la esquina inferior izquierda de la aplicación.

    image

    11) Comienza el “Flashing” del teléfono, así que sólo tenemos que esperar unos minutos para poder volver a tomar el control de nuestro teléfono.

    image

    12) Ahora a instalar aplicaciones y a esperar a que se cargue la batería al 100%. ¡It’s woking perfectly very good once again!

    Espero evitar esas frustraciones así como llegado este punto, tener un mayor control de nuestro Nokia Lumia y por supuesto, evitar el miedo a pensar que nunca más podemos perderlo de esta manera.

    Saludos and happy new Lumia & Windows Phone, Guiño .
    Juanlu, ElGuerre

    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

    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:

    • JAR File.
      • Descargar el “.jar” para Streaming (hadoop-streaming.jar).  La release es la “v1.0.3”, aunque la “v2.0.1-alpha”, al menos para este ejemplo también funciona perfectamente.
    • Parámetros
      • Parametro 1: -files "hdfs:///example/apps/map.exe,hdfs:///example/apps/reduce.exe"
      • Parametro 2: -input "asv://fivetopuri/iislog.txt" -output "asv://fivetopuriresults/results.txt"
      • Parametro 3: -mapper "map.exe" -reducer "reduce.exe"
    • El comando final queda como sigue:

    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:

    • Error “Failed Map Tasks exceed allowed limit. Failed Count: 1”
    • o incluso que el Job tarde en responder (que se haya quedado “colgado”), en cuyo caso es posible que queramos “matarlo”. Para ello:

    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:appsdist>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:Appsdist/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