Ejercicio: Administración e implementación de aplicaciones en nodos de proceso
La API cliente de Azure Batch permite controlar mediante programación todos los componentes de una cuenta de Azure Batch.
Continuando con la mejora de la aplicación de consola de la empresa, ahora agregará todos los componentes necesarios para convertir los vídeos que cargó en el último ejercicio.
Importante
Para realizar este ejercicio, se necesita una suscripción de Azure propia y puede que se apliquen cargos. Si aún no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.
Al final de este ejercicio, tendrá un proceso de Batch funcional que puede convertir vídeos MP4 en archivos GIF animados. La aplicación agregará un trabajo al grupo existente, y agregará e iniciará las tareas de conversión de vídeo.
Mejora del código mediante el cliente de Batch
En Cloud Shell, modifique el archivo
Program.cs
en el editor:code Program.cs
Agregue una constante a Program.cs para el valor JobId que se usará en el trabajo de Batch:
private const string JobId = "WinFFmpegJob";
Reemplace estas líneas del método Main:
var batchClient = BatchClient.Open(sharedKeyCredentials); // Create the Batch pool, which contains the compute nodes that execute tasks. await CreateBatchPoolAsync(batchClient, PoolId);
Con un bloque de uso para el
batchClient
:using (BatchClient batchClient = BatchClient.Open(sharedKeyCredentials)) { // Create the Batch pool, which contains the compute nodes that execute the tasks. await CreateBatchPoolAsync(batchClient, PoolId); // Create the job that runs the tasks. await CreateJobAsync(batchClient, JobId, PoolId); // Create a collection of tasks and add them to the Batch job. await AddTasksAsync(batchClient, JobId, inputFiles, outputContainerSasUrl); }
Creación de un trabajo
Agregue este nuevo método,
CreateJobAsync()
, a Program.cs para crear y agregar un trabajo al grupo:private static async Task CreateJobAsync(BatchClient batchClient, string jobId, string poolId) { Console.WriteLine("Creating job [{0}]...", jobId); CloudJob job = batchClient.JobOperations.CreateJob(); job.Id = jobId; job.PoolInformation = new PoolInformation { PoolId = poolId }; await job.CommitAsync(); }
El código anterior usa el cliente por lotes para crear un trabajo. El método asigna el identificador de trabajo proporcionado e información sobre el grupo.
Adición de una tarea
Con el trabajo creado, el último paso consiste en agregar una tarea al trabajo. Agregue el método siguiente,
AddTaskAsync()
, a Program.cs:private static async Task<List<CloudTask>> AddTasksAsync(BatchClient batchClient, string jobId, List<ResourceFile> inputFiles, string outputContainerSasUrl) { Console.WriteLine("Adding {0} tasks to job [{1}]...", inputFiles.Count, jobId); // Create a collection to hold the tasks added to the job List<CloudTask> tasks = new List<CloudTask>(); for (int i = 0; i < inputFiles.Count; i++) { // Assign a task ID for each iteration string taskId = String.Format("Task{0}", i); // Define task command line to convert the video format from MP4 to animated GIF using ffmpeg. // Note that ffmpeg syntax specifies the format as the file extension of the input file // and the output file respectively. In this case inputs are MP4. string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion); string inputMediaFile = inputFiles[i].FilePath; string outputMediaFile = String.Format("{0}{1}", System.IO.Path.GetFileNameWithoutExtension(inputMediaFile), ".gif"); // This is the dos command built by using the ffmpeg application package, the paths from the input container string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-3.4-win64-static\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile); // Create a cloud task (with the task ID and command line) and add it to the task list CloudTask task = new CloudTask(taskId, taskCommandLine); task.ResourceFiles = new List<ResourceFile> { inputFiles[i] }; // Task output file will be uploaded to the output container in Storage. List<OutputFile> outputFileList = new List<OutputFile>(); OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination(outputContainerSasUrl); OutputFile outputFile = new OutputFile(outputMediaFile, new OutputFileDestination(outputContainer), new OutputFileUploadOptions(OutputFileUploadCondition.TaskSuccess)); outputFileList.Add(outputFile); task.OutputFiles = outputFileList; tasks.Add(task); } // Call BatchClient.JobOperations.AddTask() to add the tasks as a collection rather than making a // separate call for each. Bulk task submission helps to ensure efficient underlying API // calls to the Batch service. await batchClient.JobOperations.AddTaskAsync(jobId, tasks); return tasks; }
Este último método realiza todas las acciones complejas de la aplicación. Se agrega una tarea al trabajo para cada archivo que se ha cargado. La tarea adopta la forma de un comando de shell. La aplicación (
ffmpeg
) se ha instalado en cada nodo en una ubicación específica, porque se ha usado un paquete de aplicación. El servicio Batch almacena esa ubicación en una variable de entorno en el nodo para que sea accesible a través de:%AZ_BATCH_APP_PACKAGE_ffmpeg#3.4%
Con este enfoque, resulta sencillo cargar e incrementar las versiones más recientes de la aplicación
ffmpeg
. El comando busca en la carpeta zip y se ejecuta:ffmpeg.exe -i input-filename output-filename
Para optimizar el rendimiento, las tareas se agregan como una lista a
batchClient.JobOperations.AddTaskAsync
. Esto es más eficaz que realizar una llamada independiente para cada archivo.
Prueba de la aplicación de consola
En el editor de código, haga clic con el botón derecho y seleccione Guardar, después haga clic con el botón derecho y seleccione Salir.
En Cloud Shell, compile y ejecute la aplicación:
dotnet run
Los siguientes mensajes se escriben en el terminal:
Creating container [input]. Creating container [output]. Uploading file ~\cutifypets\InputFiles\3.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\2.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\4.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\1.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\5.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\6.mp4 to container [input]... Creating pool [WinFFmpegPool]... Creating job [WinFFmpegJob]... Adding 6 tasks to job [WinFFmpegJob]...
La aplicación de consola se cierra en cuanto ha agregado las tareas. En Azure, se crean el grupo, los nodos, el trabajo y las tareas. No hay nada que supervise lo que ocurre dentro de la aplicación, ya que se ha cerrado. Para ver el estado actual de la conversión y comprobar los resultados, vuelva a Azure Portal.
En Azure Portal, seleccione la cuenta de Batch que comienza por
cutify
en el Panel.El panel de mantenimiento se muestra en la página Información general. Desde aquí, puede comprobar el estado del trabajo en ejecución actual y el grupo de nodos.
En el menú de la izquierda, seleccione Trabajos en Características y, a continuación, seleccione WinFFmpegJob. En esta página, verá el estado actual de las tareas.
Cuando se hayan completado las tareas, vuelva a la cuenta de almacenamiento que creó en el primer ejercicio.
En el menú de la izquierda, seleccione Contenedores en Almacenamiento de datos y, a continuación, seleccione la carpeta de salida.
La carpeta contiene los archivos GIF animados convertidos. Descargue un archivo para comprobar el vídeo de mascotas más lindo.