Övning – Hantera och distribuera program på beräkningsnoder

Slutförd

Med Azure Batch-klient-API:et kan du programmatiskt styra alla komponenter i ett Azure Batch-konto.

Om du fortsätter att förbättra företagets konsolapp lägger du nu till alla komponenter som behövs för att konvertera de videor som du laddade upp i den senaste övningen.

Viktig

Du behöver en egen Azure-prenumeration för att köra den här övningen och du kan debiteras. Om du inte redan har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

I slutet av den här övningen har du en fungerande Batch-process som kan konvertera MP4-videor till animerade GIF-filer. Appen lägger till ett jobb i den befintliga poolen och lägger till och startar videokonverteringsuppgifterna.

Förbättra koden med batchklienten

  1. I Cloud Shell redigerar du filen Program.cs i redigeraren:

    code Program.cs
    
  2. Lägg till en konstant i Program.cs för JobId som vi ska använda i vårt batchjobb.

    private const string JobId = "WinFFmpegJob";
    
  3. Ersätt dessa rader i metoden Main:

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

    Med ett användningsblock för 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);
    }
    

Skapa ett jobb

  1. Lägg till den här nya metoden, CreateJobAsync(), till Program.cs för att skapa och lägga till ett jobb till poolen:

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

    Föregående kod använder batchklienten för att skapa ett jobb. Metoden tilldelar det angivna jobb-ID:t och information om poolen.

Lägga till en uppgift

  1. När jobbet har skapats är det sista steget att lägga till en uppgift i jobbet. Lägg till följande metod, AddTaskAsync(), i 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;
    }
    

    Den här sista metoden utför alla komplexa åtgärder i appen. En uppgift läggs till i jobbet för varje fil som har laddats upp. Uppgiften har formen av ett gränssnittskommando. Appen (ffmpeg) har installerats på varje nod på en specifik plats eftersom vi använde ett programpaket. Batch-tjänsten lagrar den platsen i en miljövariabel på noden så att den kan nås via:

    %AZ_BATCH_APP_PACKAGE_ffmpeg#3.4%

    Med den här metoden är det enkelt att ladda upp och öka nyare versioner av ffmpeg-appen. Kommandot tittar på zip-mappen och kör:

    ffmpeg.exe -i input-filename output-filename

    För bästa prestanda läggs aktiviteterna till som en lista i batchClient.JobOperations.AddTaskAsync. Detta är effektivare än att göra ett separat anrop för varje fil.

Testa konsolappen

  1. Högerklicka i kodredigeraren och välj Sparaoch högerklicka sedan och välj Avsluta.

  2. Skapa och kör appen i Cloud Shell:

    dotnet run
    
  3. Följande meddelanden skrivs till terminalen:

    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. Konsolappen stängs så snart den har lagt till uppgifterna. I Azure skapas poolen, noderna, jobbet och uppgifterna. Det finns inget som övervakar vad som händer i appen när den har avslutats. Om du vill se konverteringens aktuella status och kontrollera resultatet går du tillbaka till Azure-portalen.

  5. I Azure-portalen, väljer du Batchkontot som börjar cutifyInstrumentpanelen.

    Skärmbild av sidan Översikt för Batch-kontot.

  6. Hälsopanelen visas på Översiktsidan. Härifrån kan du kontrollera statusen för det aktuella jobbet som körs och nodpoolen.

  7. På den vänstra menyn väljer du Jobb under Funktioneroch väljer sedan WinFFmpegJob. På den här sidan visas den aktuella statusen för aktiviteterna.

  8. När uppgifterna har slutförts återgår du till lagringskontot som du skapade i den första övningen.

  9. På den vänstra menyn väljer du Containrar under Datalagringoch väljer sedan mappen utdata.

  10. Mappen innehåller de konverterade animerade gif-filerna. Ladda ner en fil för att se den sötaste husdjursvideon.