01.07.2016 Views

acciones

299wAsX

299wAsX

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

SharedAccessExpiryTime = DateTime.UtcNow.AddHours(2),<br />

Permissions = SharedAccessBlobPermissions.Read<br />

};<br />

// Construir el URL del SAS para el blob<br />

string sasBlobToken = blobData.<br />

GetSharedAccessSignature(sasConstraints);<br />

string blobSasUri = String.Format(“{0}{1}”, blobData.Uri,<br />

sasBlobToken);<br />

return new ResourceFile(blobSasUri, blobName);<br />

}<br />

La primera parte de la rutina recorre todos los elementos<br />

de la Lista convierte el agregado con el archivo XML de<br />

cada elemento a un stream, crea una lista genérica de Tuplas<br />

que contiene el nombre del elemento y el stream del<br />

archivo XML y lo sube al contenedor del Storage utilizando<br />

la rutina “UploadFilesToContainerAsync”. Este método lee<br />

la lista genérica y sube cada elemento de ella al Storage<br />

utilizando el método “UploadFileToContainerAsync”.<br />

es posible también especificar que la configuración<br />

sea dinámica, es decir, que, si se<br />

necesita más potencia, el Pool mismo cree<br />

Máquinas Virtuales adicionales<br />

11.– Para poder subir los archivos procesados por el<br />

Batch, Azure necesita el SAS (Shared Access Signature)<br />

del contenedor del Blob de salida a utilizar en<br />

Azure Storage. De esto se encarga la rutina “GetContainerSasUrl”:<br />

private static string GetContainerSasUrl(CloudBlobClient blobClient,<br />

string containerName, SharedAccessBlobPermissions permissions)<br />

{<br />

// Propiedades del Shared Access Signature (SAS): no tiempo de<br />

inicio, SAS es valido de inmediato<br />

SharedAccessBlobPolicy sasConstraints = new<br />

SharedAccessBlobPolicy<br />

{<br />

SharedAccessExpiryTime = DateTime.UtcNow.AddHours(2),<br />

Permissions = permissions<br />

};<br />

// Construir el URL del SAS para el blob<br />

CloudBlobContainer container = blobClient.<br />

GetContainerReference(containerName);<br />

string sasContainerToken = container.<br />

GetSharedAccessSignature(sasConstraints);<br />

// Retorna el URL del contenedor, incluyendo el token SAS<br />

return String.Format(“{0}{1}”, container.Uri, sasContainerToken);<br />

}<br />

12.– De manera similar a la que se utilizó en el punto 9<br />

para crear un pointer al Azure Store, se crea una referencia<br />

al Azure Batch a utilizar, usando el nombre<br />

y llave de la cuenta del Batch:<br />

BatchSharedKeyCredentials cred = new<br />

BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName,<br />

BatchAccountKey);<br />

using (BatchClient batchClient = BatchClient.Open(cred))<br />

13.– Inicialmente, en la parte correspondiente al Batch<br />

mismo, es necesario crear el Pool que va a contener<br />

las Máquinas Virtuales de procesamiento utilizando<br />

la rutina “CreatePoolAsync”:<br />

private static async Task CreatePoolAsync(BatchClient batchClient,<br />

string poolId, IList resourceFiles)<br />

{<br />

// Crear el Pool de servidores<br />

Console.WriteLine(“Creando el Pool “ + poolId);<br />

CloudPool pool = batchClient.PoolOperations.CreatePool(<br />

poolId: poolId,<br />

targetDedicated: 2, // 2 computadores<br />

virtualMachineSize: “small”, // single-core, 1.75GB mem, disco<br />

225GB<br />

cloudServiceConfiguration: new<br />

CloudServiceConfiguration(osFamily: “4”)); // Windows Server 2012<br />

R2, ultima version<br />

pool.StartTask = new StartTask<br />

{<br />

CommandLine = “cmd /c (robocopy %AZ_BATCH_TASK_<br />

WORKING_DIR% %AZ_BATCH_NODE_SHARED_DIR%) ^& IF<br />

%ERRORLEVEL% LEQ 1 exit 0”,<br />

ResourceFiles = resourceFiles,<br />

WaitForSuccess = true<br />

};<br />

await pool.CommitAsync();<br />

}<br />

En la creación del Pool se especifica cuantos nodos (Máquinas<br />

Virtuales) se necesitan (dos en el ejemplo), que<br />

tipo de máquinas (“small” en el ejemplo) y tipo de sistema<br />

operativo (“4” en el ejemplo), aunque es posible también<br />

especificar que la configuración sea dinámica, es decir,<br />

que, si se necesita más potencia, el Pool mismo cree Máquinas<br />

Virtuales adicionales. El Pool también puede especificar<br />

un comando que se ejecuta cuando cada Máquina<br />

Virtual inicia. En este caso se está indicando que se deben<br />

crear dos variables de trabajo para contener los directorios<br />

en donde se van a subir los ejecutables y en donde se<br />

van a mantener los archivos de trabajo.<br />

14.– Una vez se tiene el Pool, es necesario crear el Job<br />

que contendrá las Tareas. De esto se encarga la rutina<br />

“CreateJobAsync”:<br />

private static async Task CreateJobAsync(BatchClient batchClient,<br />

string jobId, string poolId)<br />

{<br />

Console.WriteLine(“Creando job “ + jobId);<br />

CloudJob job = batchClient.JobOperations.CreateJob();<br />

job.Id = jobId;<br />

job.PoolInformation = new PoolInformation { PoolId = poolId };<br />

await job.CommitAsync();<br />

}<br />

15.– El método “AddTasksAsync” se encarga de crear<br />

las Tareas a ejecutar e iniciarlas:<br />

private static async Task<br />

AddTasksAsync(BatchClient batchClient, string jobId,<br />

List inputFiles, string outputContainerSasUrl)<br />

{<br />

Console.WriteLine(“Agregando “ + inputFiles.Count + “ tareas al job<br />

“ + jobId);<br />

List tasks = new List();<br />

// Crear cada Tarea. La aplicacion esta en el directorio compartido<br />

shared directory en %AZ_BATCH_NODE_SHARED_DIR%<br />

foreach (ResourceFile inputFile in inputFiles)<br />

26

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!