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

Windows Azure MEDIA SERVICES. In action !!!

MediaServicesArch

De la misma manera que el el post anterior exprimíamos Windows Azure MOBILE SERVICES, en este caso le toca el turno a Windows Azure MEDIA SERVICES.

Pues bien, estos recientes servicios (PaaS), aun en Preview, tienen como finalidad, facilitar, crear y entregar contenido multimedia a los diferentes dispositivos: HTML5, Silverlight, Flash, Windows (Windows 8, etc.), Windows Phone, Xbox, MacOS, iPhone/iPad y Android, aportando gracias a Windows Azure, flexibilidad, escalabilidad y fiabilidad en la nube y, todo ello basado en “Microsoft Media Platform”.

  • Me gustaría hacer referencia a este enlace, donde Scott Guthrie, comenta brevemente el uso de estos servicios en las olimpiadas de Londres 2012, donde se estos han soportado unas 2.300h de vídeos en directo y contenido VOD (Video On demand)HD.

Y como siempre, Microsoft pone a nuestra disposición unos mágnificos tutoriales, donde poder seguir nuestros primeros pasos. Nosotros iremos un poco más allá hasta completar un ejemplo completo y funcional además de aclarar dudas y seguir algunas recomendaciones.

 

MEDIA SERVICES soporta los siguientes escenarios:

  • Building end-to-end workflows: Todo la aplicación en el Cloud.
  • Building hybrid workflows:  Integración de aplicaciones y procesos.  Pudiendo codificar por ejemplo, contenido en “On-Premisse” subiendo el mismo a Media Services para su transcodificación y transformación en distintos formatos.
  • Providing cloud support for media players: Crear, gestionar y distribuir/entregar contenido media a diferentes dispositivos y plataformas: iOS, Android, and Windows Devices.

Una vez ya conocemos las aspectos generales, veamos a continuación lo que necesitamos para llevar a cabo nuestro ejemplo: “MyFirstMedia Services”

1. Activamos el servicio para usarlo con nuestra subscripción.

2. Creamos un servicio desde la consola de administración (Portal):

imageimage

3. Aseguramos la sincronización de “key” con nuestro storage:

image

4. Creamos, desde Visual Studio un proyecto de tipo Consola

5. Añadimos las siguientes referencias.

  • C:Program FilesMicrosoft SDKsWindows Azure.NET SDK2012-06binMicrosoft.WindowsAzure.StorageClient.dll
  • C:Program Files (x86)Microsoft WCF Data Services5.0bin.NETFramework
    • Microsoft.Data.Edm.dll
    • Microsoft.Data.OData.dll
    • Microsoft.Data.Services.dll
    • Microsoft.Data.Services.Client.dll
    • System.Spatial.dll
  • C:Program Files (x86)Microsoft SDKsWindows Azure Media ServicesServicesv1.0Microsoft.WindowsAzure.MediaServices.Client.dll

6.  Conectamos con Media Services obteniendo un Contexto.  En este punto podemos obtener el siguiente error: ”Error 400 Bad Request when using CloudMediaContext with Azure Media Services” si no se introducen correctamente estos parámetros:

   1: this._context = new CloudMediaContext(accountName, accountKey);

Donde:

  • accountName es el nombre del servicio, introducido al crear el mismo y según hemos señalado como “Account Name”.
  • accountKey es el “SECONDARY MEDIA SERVICE ACCESS KEY”.

7. Creamos y encriptamos nuestro activo y lo subimos al Storage de Windows Azure, obteniendo una referencia al container de dichos ficheros. Si el valor de encriptación es “None”, podremos ver el contenido de dichos ficheros una vez realizado el “Upload” utilizando por ejemplo, “Azure Storage Explorer”.

   1: private IAsset UpLoadFiles(string[] files)

   2: {

   3:     // (2) Creamos un asset y añadimos los activos/ficheros para hacer el Upload del asset.            

   4:     return this._context.Assets.Create(files, AssetCreationOptions.StorageEncrypted);

   5: }

En este punto podremos obtener el error: “Could not load file or assembly ‘Microsoft.WindowsAzure.StorageClient, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)” que podemos resolver (gracias al cable de John) incluyendo en nuestro “.config” el siguiente código:

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <configuration>

   3:   <runtime>

   4:      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

   5:        <dependentAssembly>

   6:          <assemblyIdentity name="Microsoft.WindowsAzure.StorageClient"

   7:                            publicKeyToken="31bf3856ad364e35"

   8:                            culture="neutral" />

   9:          <bindingRedirect oldVersion="1.1.0.0"

  10:                           newVersion="1.7.0.0"/>

  11:        </dependentAssembly>

  12:        <dependentAssembly>

  13:          <assemblyIdentity name="Microsoft.WindowsAzure.StorageClient"

  14:                            publicKeyToken="31bf3856ad364e35"

  15:                            culture="neutral" />

  16:          <publisherPolicy apply="no" />

  17:        </dependentAssembly>

  18:  

  19:      </assemblyBinding>

  20:    </runtime>  

  21: </configuration>

Una vez todo ya podemos hacer el Upload de nuestro asset, ahora ya estos listo para lanzar el Job con el Encoding adecuado:

   1: public IJob CreateEncodingJob(IAsset asset, EnumMediaProcessor enumProcesor)

   2: {

   3:     // Declarar un nuevo Job.

   4:     IJob job = this._context.Jobs.Create("My encoding job");          

   5:  

   6:     string configuration = GetConfiguration(enumProcesor);

   7:     IMediaProcessor processor = this.GetMediaProcessor(enumProcesor);

   8:  

   9:  

  10:     // Crea un tarea con el detalle de codificacion(enconding) utilizando un string preestablecido.

  11:     // Strings preestablecidos para Windows Azure Media Encoder: http://msdn.microsoft.com/en-us/library/jj129582.aspx

  12:     ITask task = job.Tasks.AddNew("My encoding task",

  13:         processor,

  14:         configuration,

  15:         TaskCreationOptions.None);

  16:  

  17:     // Especificar el Asset a codificar

  18:     task.InputMediaAssets.Add(asset);

  19:  

  20:     

  21:     // Añade un asset de salida que contiene el resultado del job.

  22:     // Este asset no es encriptado "AssetCreationOption.None"

  23:     task.OutputMediaAssets.AddNew("Output asset",

  24:         true,

  25:         AssetCreationOptions.None);

  26:  

  27:     // Ejecutar el Job. 

  28:     job.Submit();

  29:  

  30:     return job;

  31: }

En este punto, tenemos que tener claras varias cosas:

  • El Tipo de “Media Processor” a utilizar dependerá  de lo que queramos hacer. Se trata de un string como puede verse en el siguiente snippet y, para conocer todos estos tipos preestablecidos accederemos a este enlace: “Task Preset Strings for Windows Azure Media Encoder”.
  • Cada uno de estos “Media Processor” trata un tipo de ficheros/asset determinado y de la misma manera genera una salida diferente. Por tanto si estamos lanzado un Job para:
    • una conversión de .MP4 a Smooth Streaming tendremos utilizar como “Media Processor”, “MP4 to Smooth Streams Task”, que genera un asset de salida: .ism, .isma, .ismc, .ismv, necesarios para los visores de smooth streaming.
    • una conversión   “Windows Azure Media Encoder” se genera una salida: .mp4, y “_metadata.xml”.
    • Etc. En este enlace, podemos ver todos los tipos de archivos soportados por Media Services.
  • Cada Job, además de trabajar con un “Media Processor” espera una configuración para el mismo, de manera que por ejemplo, para:
   1: // http://www.windowsazure.com/en-us/develop/net/how-to-guides/media-services/

   2: // Windows Azure Media Encoder:  Media Encoder. 

   3: // PlayReady Protection Task:   PlayReady Protection. 

   4: // MP4 to Smooth Streams Task:  Conversión de  .mp4 a formato smooth streaming. 

   5: // Smooth Streams to HLS Task:  Conversión de smooth streaming a formato Apple HTTP Live Streaming (HLS). 

   6: // Storage Decryption:          Desencripta los assets que has sindo encriptados usando Storage Encription. 

   7: private IMediaProcessor GetMediaProcessor(EnumMediaProcessor mediaProcessor)

   8: {

   9:     var theProcessor =

  10:         from p in this._context.MediaProcessors

  11:         where p.Name == mediaProcessor.GetStringValue()

  12:         select p;

  13:  

  14:     IMediaProcessor processor = theProcessor.First();

  15:  

  16:     if (processor == null)

  17:     {

  18:         throw new ArgumentException(string.Format(System.Globalization.CultureInfo.CurrentCulture,

  19:             "Unknown processor",

  20:             mediaProcessor));

  21:     }

  22:     return processor;

  23: }

Si el Job ha terminado correctamente nuestra aplicación cliente podría acceder al asset y descargarlo. No obstante se puede producir erres durante la la codificación, donde para ello, haremos un chequeo del Job para corroborar su estado:

   1: private static ReadOnlyCollection<ErrorDetail> CheckJobProgress(string jobId)

   2: {

   3:     bool jobCompleted = false;

   4:     ReadOnlyCollection<ErrorDetail> jobErrors = null;

   5:  

   6:     while (!jobCompleted && (null == jobErrors))

   7:     {

   8:         IJob theJob = _manager.GetJob(jobId);

   9:         switch (theJob.State)

  10:         {

  11:             case JobState.Finished:

  12:                 jobCompleted = true;

  13:                 break;

  14:             case JobState.Queued:

  15:             case JobState.Scheduled:

  16:             case JobState.Processing:

  17:                 Thread.Sleep(5000);

  18:                 Console.Write(".");

  19:                 break;

  20:             case JobState.Error:

  21:                 jobErrors = theJob.Tasks[0].ErrorDetails;

  22:                 break;

  23:             default:

  24:                 Console.WriteLine("Unknown job state: {0}", theJob.State.ToString());

  25:                 break;

  26:         }

  27:     }

  28:     return jobErrors;

  29: }

A pesar de tener en cuenta las recomendaciones anteriores, se pueden producir algunos errores durante el “Upload” o el “Endonding del Job”

  • “Cannot import a zero-lenght file”: Se trata de error al subir un fichero de tipo imagen e intentar realizar su enconding distinto a “Storage Decryption”.
  • “One or more errors occurred” : Generalmente este se produce si intentamos subir ficheros a través de una conexión débil como por ejemplo desde una 3G con poca cobertura. El detalle de estos puede verse a continuación:

InnerException: System.Data.Services.Client.DataServiceClientException

            HResult=-2146233079

            Message=<?xml version="1.0" encoding="utf-8" standalone="yes"?><error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code></code><message xml:lang="en-US">Asset has no files uploaded.</message></error>

            Source=Microsoft.Data.Services.Client

            StatusCode=400

            StackTrace:

                 at System.Data.Services.Client.QueryResult.ExecuteQuery(DataServiceContext context)

                 at System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)

Donde Fiddler nos proporcional la siguiente información:

  • 500: <?xml version="1.0" encoding="utf-8"?><Error><Code>OperationTimedOut</Code><Message>Operation could not be completed within the specified time.

    RequestId:fc8be06f-1801-4724-a549-14a5d327d48f

    Time:2012-09-23T13:33:32.3638228Z</Message></Error>

  • 504:ReadResponse() failed: The server did not return a response for this request.
  • 502: The socket connection to mediasvc5s9w447krcczl.blob.core.windows.net failed. <br />ErrorCode: 10060. <br />A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 168.63.0.14:80
  • DNS Lookup for "mediasvc5s9w447krcczl.blob.core.windows.net" failed. No such host is known.    

Otros recomendaciones que deberíamos conocer son:

  • En la preview actual, no es posible eliminar los “Assets” subidos de ninguna manera desde la consola.  Mediante código sería de la siguiente manera, teniendo en cuenta que antes de poder borrar un Asset, tenemos que revocar (“Revoke”) su Locator. No obstante y a pesar de todo, en mis pruebas no lo he conseguido.  Supongo que es debido a la versión “Preview”:
   1: foreach (var a in this._context.Assets)

   2: {

   3:     foreach (var l in a.Locators)

   4:         this._context.Locators.Revoke(l);               

   5:  

   6:         this._context.Assets.Delete(a); 

   7: }

  • Incluyo a continuación un par de snippets que nos facilitarán los progresos de carga y descarga para así no desesperarnos:

Progreso de carga (“Upload”) de ficheros/assets:

   1: ...

   2:        _manager.Assets.OnUploadProgress += Assets_OnUploadProgress;

   3: ..

   4: rivate static void Assets_OnUploadProgress(object sender, UploadProgressEventArgs e)

   5:  

   6:    try

   7:    {

   8:        Console.WriteLine("Assets_OnUploadProgress: {0:0.00} %, {1}/{2}, {3:0.00} MB/{4:0.00} MB",

   9:        e.Progress, e.CurrentFile, e.TotalFiles, e.BytesSent / 1024 ^ 2, e.TotalBytes / 1024 ^ 2);

  10:    }

  11:    catch (Exception ex)

  12:    {

  13:        Console.WriteLine("OnUploadProgress event error: {0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace.ToString());

  14:    }

Progreso de descarga (“Download”):

   1: private static void DownloadAssetToLocal(IAsset outputAsset, string outputFolder)

   2: {

   3:     Console.WriteLine();

   4:     Console.WriteLine("Files are downloading...please wait.");

   5:     Console.WriteLine();

   6:  

   7:     foreach (IFileInfo outputFile in outputAsset.Files)

   8:     {

   9:         outputFile.OnDownloadProgress += outputFile_OnDownloadProgress;

  10:  

  11:         string localDownloadPath = Path.GetFullPath(outputFolder + @"" + outputFile.Name);

  12:         Console.WriteLine("File is downloading to:  " + localDownloadPath);

  13:         outputFile.DownloadToFile(Path.GetFullPath(outputFolder + @"" + outputFile.Name));

  14:         Console.WriteLine();

  15:     }

  16: }

  17:  

  18: static void outputFile_OnDownloadProgress(object sender, DownloadProgressEventArgs e)

  19: {

  20:     Console.WriteLine("    Bytes downloaded: " + e.BytesDownloaded);

  21:     Console.WriteLine("    Download progress %:  " + e.Progress);

  22: }

Espero haber conseguido con este recorrido a través de Media Services acercarnos un poco más al mundo Cloud con Windows Azure.


Saludos @Home

Juanlu, ElGuerre

Windows Azure MOBILE SERVICES & Windows 8

mobile-service

Muy buenas,

Hoy, me disponía a ver el funcionamiento de la reciente nueva característica de Windows Azure (“MOBILE SERVICES”) y sinceramente, ha sido bastante fácil e intuitivo entender todo lo que a ello respecta. ¡La verdad es que los tutoriales que ha preparado Microsoft son geniales además de sencillos!. Podemos encontralos aquí, en “Get Started With Mobile Services”. 

Scott Guthrie también ha escrito un post al respecto, así, que la intención de este post será profundizar un poco más e indagar en algunos otros detalles.

Veamos a continuación como funciona todo esto:

1. Habilitar esta característica. Para ello seguiremos estos pasos.

2. Accedemos al nuevo portal de Windows Azure.

3. Seguimos los pasos del tutorial de Microsoft: “Get Started With Mobile Services” donde:

  • El primer paso es Instalar el SDK para Mobile Services además de tener instalado Visual Studio
  • El segundo es Crear una aplicación nueva o conectarse a una ya existente.

4. Finalizado el tutorial y, sin esfuerzo alguno, tendremos una aplicación Windows 8 conectada a Windows Azure.

Nota: Pero, ¿Cómo funciona todo por “debajo”? Pues bien, veamos los dos aspectos más importantes:

a. Conexión con  el servicio. En la clase “App.xaml.cs”, encontraremos como crear dicha conexión con Mobile Services:

   1: public static MobileServiceClient MobileService = new MobileServiceClient(

   2:     "https://myfirstmobileservice.azure-mobile.net/",

   3:     "rbLHUGEnPzdeaXvftueqBnJyMXRuiD76"

   4: );

Donde:

  • La línea 2 es la dirección (URL) bajo la que se encuentra alojado el servicio en Windows Azure y que coincide, con el nombre que hemos introducido al crear nuestro nuevo Mobile Services “myfirstmobileservice”. El sufijo, “.azure-mobile.net” será el mismo para todos nuestros mobile services.
  • La linea 3, es nuestra “Application Key”, es decir, la clave que necesitamos para poder establecer la conexión con el servicio.  La podemos obtener o cambiar siguiendo estos dos simples pasos:

imageimage

Nota: En caso de que esta key no se corresponda la que hemos indicado en el código , obtendremos un error: “Unauthorized  (401 Unauthorized – Details: {“code”:401,”error”:”Unauthorized”})”.

b. Conexión con la BBDD: En el ejemplo y concretamente en el paso 2 del tutorial, podemos crear una tabla de ejemplo (“Create TodoItem Table”). Sin embargo, para profundizar más, veamos como cambiar la misma y añadir un par de campos nuevos: “StartDate” y “DueDate” para así poner en calendario nuestras tareas.

Lo primero es modificar la tabla “TodoItem”. Pero para esta acción, necesitaremos acceder a la misma, (a SQL Azure), a través del portal de SQL Azure, o bien, a través de la conexión desde Management Studio, o mejor aún, a través del Server Explorer de Visual Studio 2012, que ahora permite la edición de las tablas de SQL Azure en modo diseño:

image image

En mi caso, y para este ejemplo, opté por crear la tabla “TodoItem”  en mi BBDD “Northwind” que ya tengo creada en SQL Azure.

A continuación, lo siguiente es cambiar nuestro “Model”  C#, para incluir estas dos nuevas propiedades. Para el ejemplo en cuestión,  nuestro modelo se encuentra en la clase “MainPage.xaml.cs”:

   1: public class TodoItem

   2: {

   3:     public int Id { get; set; }

   4:  

   5:     [DataMember(Name = "text")]

   6:     public string Text { get; set; }

   7:  

   8:     [DataMember(Name = "complete")]

   9:     public bool Complete { get; set; }

  10:  

  11:     [DataMember(Name ="StartDate")]

  12:     public DateTime StartDate {get; set;}

  13:         

  14:     [DataMember(Name = "DueDate")]

  15:     public DateTime DueDate {get; set;}

  16: }

 

Nota: Recordemos que los nombres de los campos de la tabla deben coincidir con estas propiedades o con los indicados en la propiedad Name de “DataMember”. Recordad tambien que estos valores son “key sensitive”.

Por ultimo, sólo tenemos que añadir la introducción de estos dos nuevos valores en el código, al hacer el guardado. Podríamos haber incluido dos “DatePicker” para ambas fechas, pero para el ejemplo, bastará con verlo en el código:

   1: private void ButtonSave_Click(object sender, RoutedEventArgs e)

   2: {

   3:     var todoItem = new TodoItem { Text = TextInput.Text, StartDate = DateTime.Now,  DueDate = DateTime.Now.AddDays(1) };

   4:     InsertTodoItem(todoItem);

   5: }

Como vemos, simplemente se trata de pasar estos dos nuevos parámetros al insertar la nueva tarea. Ahora incluimos en la vista dos nuevos TextBlock en el “DataTemplate” del “ListView” y listo:

   1: <ListView Name="ListItems" Margin="62,10,0,0" Grid.Row="1">

   2:     <ListView.ItemTemplate>

   3:         <DataTemplate>

   4:             <StackPanel Orientation="Horizontal">

   5:                 <CheckBox Name="CheckBoxComplete" IsChecked="{Binding Complete, Mode=TwoWay}" Checked="CheckBoxComplete_Checked" Content="{Binding Text}" Margin="10,5" VerticalAlignment="Center"/>

   6:                 <TextBlock Name="StartDate" Text="{Binding StartDate}" Margin="10,5" />                                                                    

   7:                 <TextBlock Name="DueDate" Text="{Binding DueDate}" Margin="10,5" />

   8:             </StackPanel>

   9:         </DataTemplate>

  10:     </ListView.ItemTemplate>

  11: </ListView>

Ejecutamos y ya tenemos nuestra aplicación Windows 8 conectada a Azure y con nuestros cambios realizados en la base de datos (BBDD) SQL Azure.

image

c. Adicionalmente existen otros dos puntos a tener en cuenta y que también son incluidos en los tutoriales:

Authenticación: Para lo que tendremos que descargarnos el SDK de Live para Windows.

Notificaciones Push: Permitirá a nuestra aplicación Windows 8 recibir notificaciones. En el caso del ejemplo, tras cada inserción. Para llevar a cabo esta tarea necesitaremos la actualización de los scripts (JavaScript) de nuestros servicios. Esto podremos hacerlo accediendo a la pestaña “Data” y, a continuación, y tras seleccionar una tabla, “TodoItem” para nuestro ejemplo, seleccionando la pestaña “Script”.  Para más detalle de estos scripts podemos echar un vistazo a: Mobile Services scripting.  Adicionalmente y gracias a “Mobile Services Scripting”, podremos realizar validaciones en servidor.

Espero haber aclarado un poco más lo fácil que es disponer de una aplicación Windows 8 conectada con Windows Azure gracias a “MOBILE SERVICES”.  Y, ahora que todos estamos tan contentos haciendo nuestros pinitos con Windows 8, no hay impedimentos para no tener nuestros datos en la nube, Guiño.

Este es el primer paso desde “Mobile Services” para hacernos tan fácil nuestro trabajo, pero, hay más por venir: Integración con Windows Azure Storage, Servicios Rest, etc. En este punto surgen algunas dudas como, ¿Tendremos integración de Mobile Services para iPone/iPad, Android, etc? ¡Habrá que esperar!

Saludos @Home
Juanlu, ElGuerre (@JuanluElGuerre)

How to: Windows Azure HPC Scheduler: Getting started & “Parametric Sweep” model

HPC

Muy buenas,

Después de unos cuantos días con este post el borrador, no quiero irme de vacaciones sin completarlo.

Una de las ventajas que ofrece el Cloud Computing es el alto procesamiento/rendimento, es decir, aprovechar la elasticidad que este nos ofrece para sacarle gran partido. Ya he comentado ciertos de estos aspectos en posts anteriores: Autoscalado, Caching I y Caching II, sin embargo, en este caso hablaremos de HPC (High Performance Computing). Microsoft ya dispone de esta tecnología en On-Premisse (Windows HPC Server 2008 R2) desde hace ya bastante tiempo, para Azure (a partir del SP1. La versión más reciente es la SP3), relativamente poco, y menos aún, si hablamos de tener todo en la nube, incluso el “Head Node”. La diferencia entre ambos, radica principalmente en el despliegue.

Antes de comenzar a trabajar con Windows Azure HPC, es necesario tener claros los conceptos en los que este se apoya (y que puede profundizar aquí):

1) La ventaja de utilizar HPC sobre Windows Azure nos permite pagar sólamente por lo que usamos (“Pay as you go”) y  Elasticidad.

2) Windows Azure HPC Scheduler: Cluster HPC completamente en Azure y cuya arquitectura es:

  • Head Node: Gestión y scheduling de Jobs para el cluster HPC. Proporciona “Failover”, control y acceso a los recursos del Cluster. Compute Node: Realiza las tareas asignadas por el “Job Scheduler”.
  • Job Scheduler: Colas de Jobs y tareas asociadas. Asigna recursos a estos Jobs, inicializa las tareas en los “Compute Nodes” y monitoriza el estado de los Jobs, tareas y “Compute Nodes”.
  • Broker Node: Actúa como intermediario entre la aplicación y los servicios.  Balancea la carga de peticiones a servicios y finalmente retorna los resultados a la aplicación.

Azure-HPCimage

3) Modelos de aplicación:  Sabiendo que  Windows HPC SP3 soporta Jobs que permiten la integración de diferentes escenarios, y donde cada Job tiene sus propiedades, herramientas y APIs (con sus modelos de desarrollo y despliegue), los modelos de aplicación soportados son:

  • Parametric sweep:>  Tareas independientes y sin interacción entre ellas. No se hace uso del “Broker Node”.  Basicamente, reciben datos de entrada, los procesa y retorna el resultado almacenándolo en un “storage” accesible por los clientes. (Ej.: Windows Azure Storage o SQL Azure).
  • MS-MPI (Microsoft Message Passing Interface): Intercambio de mensajes usado en aplicaciones paralelas (ejecutables que corren en multiples cores o nodos y que tienen dependencia entre ellos y necesitan comunicarse). Usado principalmente para el intercambio de resultados intermedios.
  • SOA Applications. Orientación a servicios  basada en WCF. Aplicaciones candidatas para el escalado en un cluster.  La obtención de resultados puede producirse de manera:
    • Interactiva”: Intercambio de mensages request/response.
    • Durable”: Para una petición asíncrona, los resultados puedan ser consultados en cualquier momento incluso después de haber estado desconectado.  Para ello, el “Broker” hace uso de colas MSMQ.
  • Microsoft Excel Offloading.
    • UDF’s: (XLL)
    • WCF Services Call: (VSTO)
      •  

image image

4) Prerrequisitos

Para poder trabajar con Windows Azure HPC Scheduler son necesarios algunos prerrequisitos:

  1. Windows Azure SDK (v1.7)
  2. Windows Azure HPC Scheduler SDK (v1.7)
  3. HPC Pack 2008 R2 Client Utilities Redistributable Package with Service Pack 4. Necesario para interactuar con  el “Job Scheduler”
  4. [Opcional] HPC Pack 2008 R2 MS-MPI Redistributable Package with Service Pack 4 Ejecución de aplicaciones MPI sin tener que crear un cluster HPC.

IMPORTANTE: Me gustaría aclarar en este punto, que Windows Azure HPC no dispone de un portal propio para la adminstración del cluster HPC. Sin embargo, este se genera automáticamente durante el despliegue de la aplicación. Será necesario incluir un “Web Role” e insertar la instrucción “<VirtualApplication name=”Portal”… dentro de nuestro fichero “ServiceDefinition.csdef”  tal y como indico a continuación:

   1: <WebRole name="FrontEnd" vmsize="Small">

   2:     <Sites>

   3:       <Site name="Web">

   4:         <VirtualApplication name="Portal" physicalDirectory="C:Program FilesWindows Azure HPC Scheduler SDKv1.7hpcportal" />

   5:         <Bindings>

   6:           <Binding name="HPCWebServiceHttps" endpointName="Microsoft.Hpc.Azure.Endpoint.HPCWebServiceHttps" />

   7:         </Bindings>

   8:       </Site>

   9:     </Sites>

Se trata simplememente de levantar el portal HPC que incluye el SDK HPC.

5) Configuración y Deploy en Azure PARAMETRIC SWEEP

5.1) En primper lugar, y partiendo del ejemplo Parametric Sweep, necesitaremos realizar algunos cambios para adaptarlo a las últimas versiones (“v1.7” tanto de “Windows Azure SDK” como de “Windows Azure HPC Scheduler SDK”):

  • ServiceDefinition.csdef: Cambiar la versión “v1.6” por “v1.7”: <VirtualApplication name=”Portal” physicalDirectory=”C:Program FilesWindows Azure HPC Scheduler SDKv1.7hpcportal” />
  • AzureSampleService: BuildEvents – Pre-Build Event:  Cambiar la ruta del “cspack” para que pase a ser esta: “C:Program FilesMicrosoft SDKsWindows Azure.NET SDK2012-06bincspack.exe…
  • AppConfigure – BuildEvents – Post-Build Event: Cambiar la versión v1.6 por v1.7: “HKLMSoftwareMicrosoftWindows Azure HPC Schedulerv1.7 …”.
  • AppConfigure.CreateCscfgFile(cs). Comentar la línea  “config.EnableL2H();”.  Al ser un elemento beta es posible que haya sido eliminado en la v1.7, como puede verse aquí.

5.2) El deploy de un entorno HPC requiere varios pasos y tener claros ciertos aspectos de preparación y configuración. Todos ellos podemos encontrarlos identificados aquí. Debido a todos estos pasos, como veremos en los ejemplos, no optaremos por la publicación estandar que ofrece Visual Studio.

Para este ejemplo, o cualquier otro, los pasos a seguir para la configuración y despliegue del HPC en Azure son siempre los mismos. Es más, cada una de nuestras nuevas aplicaciones que hagan uso de Windows Azure HPC podrían contener siempre un solution Folder llamado “Deployment” con los proyectos “AppConfigure” y “CertificateGenerator” encargados de la configuración y despliegue. Adicionalmente, también contaremos con un “Web Role” destinado al Portal según he comentado anteriormente.

Los pasos son los siguientes:

  • Abrir el el proyecto desde Visual Studio 2010 ó 2012 RC
  • Compilar la solución.
  • Haber generado un “Hosted Service” desdel el portal de azure. Para este ejemplo “elguerrehpc”.
  • Ejecutar del Proyecto “AppConfigure” e introducir los parámetros de configuración para la subscripción de Azure a utilizar
  • Configurar (“Configure”) y cuando esta haya finalizado, Publicar (“Publish”). Esta acción creará un Storage y una BBDD SQL Azure, ambos con el mismo nombre del host, “elguerrehpc” en nuestro caso.

image

5.3) Durante la publicación, entre los mensajes asociados al “progress bar”, aparecerá, “Coping HPC package to blog storage…”, que nos hará esperar unos cuantos minutos y, tras el, veremos este otro, “Creating Azure Deployment…”, lo que significa, que si vamos al portal de Azure veremos el progreso de creación de los tres nodos configurados: Head Node, Compute Node y Frontend.

image

5.4) Tras varios minutos, tendremos nuestro despliegue listo para que comience automáticamente la creación de los nodos y configuración del HPC en Azure.

Finalizado el despligue, podremos acceder a la url: https://elguerrehpc.cloudapp.net, donde accederemos a una pagina de bienvenida(nuestro Web Role) desde donde podremos realizar la conexión remota con el Head Node o acceder al portal de HPC Scheduler. Importante, siempre con HTTPS.

image

Para este enlace al portal, en la página “Default.aspx” de nuestro “Web Role” se ha incluido una instrucción similar a la siguiente y que se corresponde con la configuración indicada anteriormente en el punto (4):

<a href="~/portal" runat="server" ID="PortalButton1" >

De la misma manera, el link “remote desktop connection” habrá que generarlo explícitamente en la página “Default.aspx” aunque requiere de un poco más código que veremos en alguno de los ejemplos. No obstante, y como siempre, podremos acceder a través de Portal de Azure.

5.5) Mediante esta conexión remota  podremos acceder directamente a la VM donde comprobaremos:

  • Herramientas de HPC instaladas y Dlls y ejecutables desplegados según cada nodo/role.

image

  • En el “Head Node”, adicionalmente, podremos comprobar la ubicación física del Portal de HPC.

image

  • Variables de entorno relacionadas con HPC y posiblemente necesarias para algunas de nuestras aplicaciones/procesos.

image

  • HPC Job Manager:

image

6) Ejecución de un Job

Mediante el link https://elguerrehpc.cloudapp.net/portal, tendremos acceso directo al cluster que hemos configurado y desplegado sin tener que acceder a alguna de las maquinas virtuales en particular.

image

A partir de aquí, seguiremos los siguientes pasos:

Importante: Recuerda incluir un “*” en el paso 2, en “Commmand Line”.

6.1) Submission Pages

imageimageimageimage

image

6.2) New Job

image

imageimage

7) Resultado de la ejecución del Job

Una vez hemos realizado el “Submit” según el paso anterior, si accedemos al listado de “My Jobs” y seleccionamos “CPUSpinner” veremos que:

  • Se han ejecutado las 1000 tareas correctamente en 18 minutos.

imageimage

imageimage

Si ahora dejamos sólo una instancia de Azure para el “Compute Node” la duración de ejecución del Job será del doble (30min para ser exactos, es decir 12min más), y a la inversa, es decir si subimos el número de instancias, el tiempo será menor.  De esta manera y extrapolando estos resultados a aplicaciones/procesos en el mundo reaal y con altos requerimientos en cuanto a los tiempos de ejecución, obtendríamos una ganancia que de otra forma sería casi imposible.

Aunque esto podemos conseguirlo con HPC en un datacenter en “On-Premise”, si el numero de máquinas necesarias fuera elevado, podríamos no disponer del hardware adecuado  o incluso no disponer de espacio para más máquinas virtuales en un entorno Virtual, teniendo en cuenta además, la configuración necesaria que ello conlleva. Por tanto, la escalabilidad se complicaría teniendo que esperar hasta recibir físicamente la(s) nueva(s) máquina(s)/servidor(es). Es aquí, donde Windows Azure una vez más aquiere gran importancia. Con Windows Azure este problema dejaría de existir y, si este Job se lanzara en determinados momentos (una vez al día, o a la semana, o al més), sólo pagaríamos por el tiempo de uso, así que el ahorro de costes podría llegar a ser enorme.

Finalmente se ha alargado un poco el Post, pero creo que la situación lo ha requerido y ha merecido la pena. En posts sucesivos iremos viendo cada uno de los restantes modelos de aplicación que soporta Windows Azure HPC Scheduler.

 

Saludos @Home & Happy HPC Coding !
Juanlu, ElGuerre

“PINGing…” desde “On-Premisse” hacia máquinas virtuales de Windows Azure

imageMuy buenas,

Seguro que en más de una ocasión has intentado hacer un ping desde tu PC, o desde una máquina “On-Premisse” hacia una máquina concreta en Windows Azure. Para ello, y, aunque no es una buena practica en situaciones normales, es necesario habiltar una de las reglas de Firewall. Como puedes imaginar, ahora con las nuevas carácteríscias de Azure y, concretamente, gracias a la persistencia de VM’s, bastará con hacerlo de manera manual. Claro está, esto será válido siempre que estés trabajando en un tipo de Cloud “IaaS”.

Para hacerlo en un modelo de Cloud “PaaS”, seguiremos los siguientes pasos:

  • Crearemos nuestro proyecto  de tipo “Clolud” desde Visual Studio 2010 ó 2012.
  • Haremos uso de las “Startup Tasks” tal y como ya comentaba en este post anterior, con la diferencia en este caso, de que nuestro fichero “Startup.cmd” tendrá el siguiente contenido y que no necesitaremos ningún otro instalable adicional:
   1: Echo Enable ICMP

   2: netsh advfirewall firewall add rule name="ICMPv6" dir=in action=allow enable=yes protocol=icmpv6

   3: exit /b 0

  • Configurar “Windows Azure Connect” (“Virtual Network”).
  • Listo. A partir de ahora, ya tendrás visibilidad directa con  tu máquina virtual de Azure. No sólo para hacer un Ping, si no para acceder a ella directamente, recueda, ¡ahora tienes una “VPN” !

IMPORTANTE: La gran ventaja de hacer esta labor como “Startup Task” es el automatismo ante posibles reciclados de las máquina de Azure.

Y, adicionalmente como siempre, puedes encontrar más detalle aquí.

Saludos y a seguir esperando las vacaciones…
Juanlu

Windows Azure Connect: Problemas de instalación en Windows 8 y Windows Server 2012

Muy buenas,

Hoy me disponía a preparar una pequeña demo de Windows Azure Connect con objeto de tenerlo todo listo para mañana pero me encuentro con este error:

image

Error: "Windows azure connect installation cannot continue”.  ¡Si es que Murphy, siempre está entre nosotros! jeje…

Este error se debe a que “Windows Azure Connect” aún no está disponible para Windows 8 ni para Windows Server 2012, por tanto, para solucionar el problema seguiremos los siguientes pasos:

  • Guardamos el fichero de instalación en local en lugar de ejecutarlo directamente

image

  • Cambiamos las propiedades de dicho fichero/instalable para que mantenga compatibilidad con “Windows 7”

image

  • Finalmente, si volvemos a lanzar la instalación  conseguiremos instalarlo sin ningún otro problema

imageimage

  • Actualizamos nuestro Enpoint Group desde el portal de Windows Azure y ya tenemos nuestro PC conectado a “Windows Azure Connet”  para poder acceder desde cualquiera de las máquinas pertenecienes a esta red virtual.

image

Gracias a esta referencia, ha sido todo más fácil.  Espero, al menos, haber resfrescado o aportado un granito de arena en nuestro día a día con Azure!

Saludos @"Yo Azure" Demo
Juanlu

Windows Azure Caching (Preview) II: Caché dedicada o distribuida y su “Capacity Planning”

image31_thumb[3]AzureCachingPreview_Dedicated

Hace unos días veímamos en este artículo: “Windows Azure Caching (Preview) I: Introducción y análisis de la caché  “Co-Located”, una distinción entre los distintos tipos de caché que presenta Windows Azure Caching (Preview) además de las diferencias con “Windows Azure Shared Caching”. En el ejemplo desarrollado vimos como hacer uso de la misma y como realizar su despliegue en la nube.

 

Nuevamente, hablaremos de la caché, pero en este caso, concretamente de la caché dedicada o distribuida con Windows Azure.

 

Veamos cuales son los pasos y camino a seguir para tener una caché altamente escalable:

Desde  Visual Studio 2012 RC, creamos un proyecto de tipo “Windows Azure Cloud Service” con el nombre ““WindowsAzureDedicatedCache”  al que añadimos dos Roles, uno de tipo “ASP.NET MVC 4 Web Role” y otro, de tipo “Cache Worker Role”.

image

Seguiremos los mismos pasos que el el post anterior:

  • Añadiremos las referencias al proyecto MVC con Nuget.
  • Crearemos el nuevo Controller y las vistas para mostrarr el uso de esta nueva caché junto con el mísmo código. 

Para el Role de tipo ASP.NET MVC, al contrario que en el ejemplo anterior, desabilitamos el uso de Caching.

imageimage

  • Ahora habilitamos la caché para el Role de tipo “Cache Worker Role”:

imageimage

 

De la misma manera que en ejemplo del post anterior, realizamos el despliegue habilitando la conexión remota:

image

Finalizado el despliegue nuesta aplicación funcionará exactamente igual. La diferencia es que en este caso, se trata de una caché Dedicada o distribuida, con lo que si para el Role Web (ASP.NET MVC), además de un reciclado de su Application Pool, o un “IISReset” o un reinicio del servicio “World Wide Web Publishing Service”,  reiniciamos el Role de Azure, los valores almacenados en la caché permanecen, sin duda, puesto que se encuentra en otro Role.

 

Si ahora, nos conectamos remotamente a la VM correspondiente al “Cache Worker Role”, podremos observar en este caso, que el tamaño usado por el servicio “CacheServie.exe” asciende a 1GB aproximadamente.

image_thumb111

¿Por qué esto valor? Pues bien, este valor o consumo de memoria, está relacionado directamente con las capacidades que ofrece Windows Azure de acuerdo a los tamaños de las VM’s y según puede verse en la siguiente tabla:

image_thumb13

De ahí, que en nuestro ejemplo, como estamos haciendo uso de una instancia “Small” este valor sea de 1GB.

En base a estos tamaños, es recomendable que antes de comenzar  un proyecto tengamos claro  cual será el tamaño de nuestra caché. Pare ello, Microsoft proporciona una hoja Exel (“Capacity Planning Guide spreadsheet”),donde podemos realizar los cálculos necesarios para la estimación oportuna y así, poder escalar  Horizontalmente o Verticalmente en función a dicha necesidad.

En esta hoja, también se realizan las estimaciones para el uso de caché “Co-Located” donde en lugar de estos tamaños se obtienen  porcentajes (”%”), puesto que se trata de compartir la memoria de un Role en concreto con el uso de cache. En el ejemplo del post anterior este valor se correspondía con un 30%, que es valor establecido por defecto para una instancia pequeña (“Small”) pero que dependerá igualmente según el tamaño de la instancia.,

 

Una vez más, espero que haya sido de utilidad.

 

Saludos @Home
Juanlu, ElGuerre