Controlando el Clúster de HDInsight (Hadoop) programáticamente y ahorrando costes: Con C# !!!

imageMuy buenas,

Después de varios posts en los que hemos estado hablando de HDInsight (Hadoop de Microsoft), aun a pesar de quedarnos pendientes muchos puntos sobre los que hablar, en esta ocasión me gustaría profundizar en la gestión automática de HDInsight.

 

La importancia de este tema radica principalmente en los siguientes puntos:

  • El coste de HDInsight, que dependerá del tiempo que tendremos activas las máquinas de Windows Azure. Recordemos que los nodos necesarios para trabajar con el clúster de HDInsight son como mínimo 2 máquinas virtuales: Una como “Head Node” A4  [L] (8 x 1.6GHz CPU, 14GB RAM, 2,040GB Storage) y otra como “Compute Node” A3 [XL] (4 x 1.6GHz CPU, 7GB RAM, 1,000GB Storage).
  • Ejecución temporal de Jobs

Teniendo en cuenta estos puntos podemos:

  • Hacer un mayor aprovechamiento de HDInsight
  • Conseguir una reducción de los costes o, incluso,
  • Por el mismo coste, obtener una mayor velocidad de proceso, aprovisionando más máquinas durante el menor tiempo posible.

Los pasos para conseguirlo programáticamente con C#:

1) Crear un certificado e instalarlo en local con el fin de poder hacer el despliegue automático:

"C:Program Files (x86)Microsoft SDKsWindowsv7.1ABinmakecert" -sky exchange -r -n "CN=WAHDInsight" -pe -a sha1 -len 2048 -ss My "WAHDInsight.cer"

 

2) Crear un proyecto de tipo consola.

3) Añadir al proyecto las referencias “Microsoft .NET API For Windows Azure HDInsight Cluster Management”  (versión actual: 0.8.4903.27316).

4) Incluir el siguiente código:

   1: static void Main(string[] args)

   2: {

   3:     // Get certificate

   4:     var store = new X509Store();

   5:     store.Open(OpenFlags.ReadOnly);

   6:     var cert = store.Certificates.Cast<X509Certificate2>().First(

   7:         item => item.Thumbprint.Equals(Subscription.Thumbprint, StringComparison.InvariantCultureIgnoreCase));

   8:  

   9:  

  10:     // Create client object to connect to Azure

  11:     var client = new ClusterProvisioningClient(Subscription.SubscriptionId, cert);

  12:  

  13:  

  14:     // Specify details of the cluster to create

  15:     var clusterInfo = new HDInsightClusterCreationDetails();

  16:     clusterInfo.Name = Cluster.Name;

  17:     clusterInfo.Location = Cluster.Location;

  18:     clusterInfo.DefaultStorageAccountName = Subscription.StorageAccountName;

  19:     clusterInfo.DefaultStorageAccountKey = Subscription.StorageAccountKey;

  20:     clusterInfo.DefaultStorageContainer = Subscription.StorageContainer;

  21:     clusterInfo.UserName = Subscription.UserName;

  22:     clusterInfo.Password = Subscription.Password;

  23:     clusterInfo.ClusterSizeInNodes = Cluster.Size;

  24:             

  25:     var cluster = client.CreateCluster(clusterInfo);

  26:     Console.WriteLine("Created cluster: {0}", cluster.ConnectionUrl);

  27: }

5) Crear un fichero de configuración “App.config” e incluir los siguientes parámetros:

   1: <appSettings>

   2:   <add key="SubscriptionId" value="###SUBSCRIPTION_ID###"/>

   3:   <add key="Thumbprint" value="‎###CERTIFICATE_THUMBPRINT###"/>

   4:  

   5:   <add key="StorageAccountName" value="###AZURE_STORAGE_NAME###.blob.core.windows.net"/>

   6:   <add key="StorageAccountKey" value="###AZURE_STORAGE_KEY###"/>

   7:   <add key="StorageContainer" value="###AZURE_STORAGE_CONTAINER###"/>

   8:  

   9:   <add key="UserName" value="admin"/>

  10:   <add key="Password" value="###PASSWORD_CLUSTER_HDINSIGHT###"/>

  11: </appSettings>

6) Tras unos minutos, el Cluster estará creado y podremos trabajar con él tal y como hemos visto en post anteriores.

image

image

7) Finalizada las tareas a realizar con el Cluster, borramos el cluster para evitar el consumo innecesario de €€€ por tener activas las Maquinas virtuales que componen el Cluster.

Nota: Recordemos que se factura por hora de VM aunque estas no estén trabajando.

   1: // Get certificate

   2: var store = new X509Store();

   3: store.Open(OpenFlags.ReadOnly);

   4: var cert = store.Certificates.Cast<;X509Certificate2>().First(

   5:     item =>; item.Thumbprint.Equals(Subscription.Thumbprint, StringComparison.InvariantCultureIgnoreCase));

   6:  

   7:  

   8: // Create client object to connect to Azure

   9: var client = new ClusterProvisioningClient(Subscription.SubscriptionId, cert);

  10: 

  11: // Remove cluster "mycluster"

  12: client.DeleteCluster(Cluster.Name);

 

Un ejemplo completo del código podéis encontrarlo aquí.

Después de esto, nadie puede decir que Windows Azure no es Auto-Scalable, Guiño

 

Continuaremos programando para HDInsight…

 

Saludos and happy HDInsight programming  !

Juanlu, ElGuerre

Leave a Reply

Your email address will not be published. Required fields are marked *