Ejercicio: Administración e implementación de aplicaciones en nodos de proceso

Completado

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

  1. En Cloud Shell, modifique el archivo Program.cs en el editor:

    code Program.cs
    
  2. Agregue una constante a Program.cs para el valor JobId que se usará en el trabajo de Batch:

    private const string JobId = "WinFFmpegJob";
    
  3. 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

  1. 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

  1. 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

  1. 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.

  2. En Cloud Shell, compile y ejecute la aplicación:

    dotnet run
    
  3. 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]...
    
  4. 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.

  5. En Azure Portal, seleccione la cuenta de Batch que comienza por cutify en el Panel.

    Screenshot of the Overview page of the Batch account.

  6. 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.

  7. 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.

  8. Cuando se hayan completado las tareas, vuelva a la cuenta de almacenamiento que creó en el primer ejercicio.

  9. En el menú de la izquierda, seleccione Contenedores en Almacenamiento de datos y, a continuación, seleccione la carpeta de salida.

  10. La carpeta contiene los archivos GIF animados convertidos. Descargue un archivo para comprobar el vídeo de mascotas más lindo.