Exercício – gerir e implementar aplicações em nós de computação
A API de cliente do Azure Batch permite-lhe controlar de forma programática todos os componentes de uma conta do Azure Batch.
Continuando a aprimorar o aplicativo de console da sua empresa, você adicionará todos os componentes necessários para converter os vídeos carregados no último exercício.
Importante
Precisa da sua própria subscrição do Azure para executar este exercício e poderá incorrer em custos. Se ainda não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
No final deste exercício, terá um processo do Batch em funcionamento que consegue converter vídeos MP4 em GIFs animados. A aplicação irá adicionar um trabalho ao conjunto existente e irá adicionar e iniciar as tarefas de conversão de vídeo.
Melhorar o código com o cliente do Batch
No Cloud Shell, edite o ficheiro
Program.cs
no editor:code Program.cs
Adicione uma constante ao Program.cs para o JobId que usaremos em nosso trabalho em lote:
private const string JobId = "WinFFmpegJob";
Substitua estas linhas no método Main:
var batchClient = BatchClient.Open(sharedKeyCredentials); // Create the Batch pool, which contains the compute nodes that execute tasks. await CreateBatchPoolAsync(batchClient, PoolId);
Com um bloco de utilização para o
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); }
Criar um trabalho
Adicione este novo método,
CreateJobAsync()
, ao Program.cs criar e adicionar um trabalho ao pool: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(); }
O código anterior usa o cliente em lote para criar um trabalho. O método atribui a ID de trabalho fornecida e informações sobre o pool.
Adicionar uma tarefa
Com o trabalho criado, o último passo é adicionar uma tarefa ao trabalho. Adicione o seguinte método,
AddTaskAsync()
, ao 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 método final realiza todas as ações complexas da aplicação. É adicionada uma tarefa ao trabalho para cada ficheiro que foi carregado. A tarefa assume a forma de um comando da shell. A aplicação (
ffmpeg
) foi instalada em cada nó numa localização específica porque utilizámos um pacote de aplicação. O serviço Batch armazena essa localização numa variável de ambiente no nó para que possa ser acedida através de:%AZ_BATCH_APP_PACKAGE_ffmpeg#3.4%
Usando essa abordagem, é fácil carregar e incrementar versões mais recentes do
ffmpeg
aplicativo. O comando examina a pasta zip e executa:ffmpeg.exe -i input-filename output-filename
Para obter o melhor desempenho, as tarefas são adicionadas como uma lista ao
batchClient.JobOperations.AddTaskAsync
. Isto é mais eficiente do que fazer uma chamada separada para cada ficheiro.
Testar a aplicação de consola
No editor de códigos, clique com o botão direito do mouse e selecione Salvar, clique com o botão direito do mouse e selecione Sair.
No shell da nuvem, crie e execute o aplicativo:
dotnet run
As seguintes mensagens são gravadas no 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]...
A aplicação de consola fecha assim que tiver adicionado as tarefas. No Azure, o conjunto, nós, trabalho e tarefas são criados. Não há nada a monitorizar o que está a acontecer na aplicação, pois foi encerrada. Para ver o estado atual da conversão e verificar os resultados, regresse ao portal do Azure.
No portal do Azure, selecione a conta Batch começando
cutify
no Dashboard.O painel de integridade é mostrado na página Visão geral . A partir daqui, você pode verificar o status do trabalho em execução atual e o pool de nós.
No menu à esquerda, selecione Trabalhos em Recursos e, em seguida, selecione WinFFmpegJob. Nesta página, verá o estado atual das tarefas.
Quando as tarefas forem concluídas, retorne à conta de armazenamento criada no primeiro exercício.
No menu à esquerda, selecione Contêineres em Armazenamento de dados e, em seguida, selecione a pasta de saída.
A pasta contém os ficheiros gif animados convertidos. Transfira um ficheiro para ver o vídeo mais fofo de animais.