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