Упражнение. Управление и развертывание приложений на вычислительных узлах

Завершено

API пакетного клиента Azure позволяет программно контролировать все компоненты учетной записи пакетной службы Azure.

Продолжая улучшать консольное приложение вашей компании, вы теперь добавите все компоненты, необходимые для преобразования видео, которые вы загрузили в последнем упражнении.

Важный

Для выполнения этого упражнения вам потребуется собственная подписка Azure, и могут взиматься сборы. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись перед началом работы.

В конце этого упражнения вы получите рабочий пакетный процесс, который может преобразовать видео MP4 в анимированные GIF-файлы. Приложение добавит задание в существующий пул и добавит и запустит задачи преобразования видео.

Улучшите код с помощью пакетного клиента

  1. В Cloud Shell измените файл Program.cs в редакторе:

    code Program.cs
    
  2. Добавьте константу в Program.cs для идентификатора задачи (JobId), который мы будем использовать в нашем батчевом задании:

    private const string JobId = "WinFFmpegJob";
    
  3. Замените эти строки в методе Main:

        var batchClient = BatchClient.Open(sharedKeyCredentials);
    
        // Create the Batch pool, which contains the compute nodes that execute tasks.
        await CreateBatchPoolAsync(batchClient, PoolId);
    

    При использовании блока using для 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);
    }
    

Создание задания

  1. Добавьте этот новый метод CreateJobAsync()в Program.cs, чтобы создать и добавить задание в пул:

    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();
    }
    

    Предыдущий код использует пакетный клиент для создания задания. Метод назначает идентификатор заданного задания и предоставляет информацию о пуле.

Добавление задачи

  1. После создания задания последним шагом является добавление задачи в этом задании. Добавьте следующий метод, AddTaskAsync(), в 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;
    }
    

    Этот окончательный метод выполняет все сложные действия приложения. Задача добавляется в задание для каждого отправленного файла. Задача принимает форму команды оболочки. Приложение (ffmpeg) установлено на каждом узле в определенном расположении, так как мы использовали пакет приложения. Служба пакетной обработки сохраняет это расположение в переменной среды на узле, чтобы к нему можно было получить доступ через:

    %AZ_BATCH_APP_PACKAGE_ffmpeg#3.4%

    С помощью этого подхода легко отправлять и обновлять новые версии приложения ffmpeg. Команда выполняет поиск в zip-папке и выполняет следующее:

    ffmpeg.exe -i input-filename output-filename

    Для наилучшей производительности задачи добавляются как список в batchClient.JobOperations.AddTaskAsync. Это более эффективно, чем выполнение отдельного вызова для каждого файла.

Тестирование консольного приложения

  1. В редакторе кода щелкните правой кнопкой мыши и выберите Сохранить, а затем щелкните правой кнопкой мыши и выберите Выйти.

  2. В облачной оболочке создайте и запустите приложение:

    dotnet run
    
  3. В терминал записываются следующие сообщения:

    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. Консольное приложение закрывается сразу после добавления задач. В Azure создаются пул, узлы, задания и задачи. Ничто не отслеживает, что происходит в приложении, так как оно завершило работу. Чтобы просмотреть текущее состояние преобразования и проверить результаты, вернитесь на портал Azure.

  5. На портале Azure выберите учетную запись Batch, начинающуюся с cutify на панели мониторинга .

    снимок экрана страницы Общего обзора учетной записи Batch.

  6. Панель управления здоровьем отображается на странице Обзор. Здесь можно проверить состояние текущего выполняемого задания и пула узлов.

  7. В меню слева выберите Jobs в разделе Функции, а затем выберите WinFFmpegJob. На этой странице вы увидите текущее состояние задач.

  8. По завершении задач вернитесь к учетной записи хранения, созданной в первом упражнении.

  9. В меню слева выберите контейнеры под хранилищем данных, затем выберите выходную папку.

  10. Папка содержит преобразованные анимированные GIF-файлы. Скачайте файл, чтобы посмотреть самое милое видео домашних животных.