Udostępnij za pośrednictwem


Samouczek: uruchamianie równoległego obciążenia w usłudze Azure Batch przy użyciu interfejsu API .NET

Usługa Azure Batch umożliwia wydajne uruchamianie równoległych zadań wsadowych oraz zadań wsadowych obliczeń o wysokiej wydajności na platformie Azure. W tym samouczku przedstawiono przykład uruchamiania równoległego obciążenia za pomocą usługi Azure Batch i języka C#. Poznasz prosty przepływ pracy aplikacji usługi Azure Batch i sposób pracy programowej z zasobami usług Azure Batch i Storage.

  • Dodaj pakiet aplikacji do konta usługi Batch.
  • Uwierzytelnianie przy użyciu kont usługi Batch i usługi Storage.
  • Przekazywanie plików wejściowych do usługi Storage.
  • Utwórz pulę węzłów obliczeniowych, aby uruchomić aplikację.
  • Utwórz zadanie i zadania przetwarzania plików wejściowych.
  • Monitorowanie wykonywania zadań.
  • Pobieranie plików wyjściowych.

W tym samouczku przekonwertujesz pliki multimedialne MP4 na format MP3, równolegle przy użyciu narzędzia open source ffmpeg .

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

Logowanie się do platformy Azure

Zaloguj się w witrynie Azure Portal.

Dodawanie pakietu aplikacji

W witrynie Azure Portal dodaj narzędzie ffmpeg jako pakiet aplikacji do konta usługi Batch. Pakiety aplikacji ułatwiają zarządzanie aplikacjami zadań i wdrażanie ich w węzłach obliczeniowych w puli.

  1. W witrynie Azure Portal kliknij pozycję Więcej usług>Usługi Batch i wybierz nazwę konta usługi Batch.

  2. Kliknij pozycję Aplikacje>Dodaj.

    Zrzut ekranu przedstawiający sekcję Aplikacje konta wsadowego.

  3. Wprowadź wartość ffmpeg w polu Identyfikator aplikacji i wersję pakietu 4.3.1 w polu Wersja. Wybierz pobrany plik zip ffmpeg, a następnie wybierz pozycję Prześlij. Pakiet aplikacji z narzędziem ffmpeg zostanie dodany do konta usługi Batch.

    Zrzut ekranu przedstawiający pola Identyfikator i wersja w sekcji Dodawanie aplikacji.

Uzyskiwanie poświadczeń konta

W tym przykładzie należy podać poświadczenia dla kont usług Batch i Storage. Najprościej jest uzyskać wymagane poświadczenia w witrynie Azure Portal. (Te poświadczenia możesz również uzyskać za pomocą interfejsów API platformy Azure lub narzędzi wiersza polecenia).

  1. Wybierz pozycję Wszystkie konta usługi>Batch, a następnie wybierz nazwę konta usługi Batch.

  2. Aby wyświetlić poświadczenia usługi Batch, wybierz pozycję Klucze. Skopiuj wartości z pól Konto usługi Batch, Adres URL i Podstawowy klucz dostępu do edytora tekstów.

  3. Aby wyświetlić nazwę i klucze konta magazynu, wybierz pozycję Konto magazynu. Skopiuj wartości z pól Nazwa konta usługi Storage i Klucz1 do edytora tekstów.

Pobieranie i uruchamianie przykładowej aplikacji

Pobieranie przykładowej aplikacji

Pobierz lub sklonuj przykładową aplikację z usługi GitHub. Aby sklonować repozytorium przykładowej aplikacji za pomocą klienta Git, użyj następującego polecenia:

git clone https://github.com/Azure-Samples/batch-dotnet-ffmpeg-tutorial.git

Przejdź do katalogu zawierającego plik rozwiązania programu Visual Studio BatchDotNetFfmpegTutorial.sln.

Upewnij się również, że odwołanie do pakietu aplikacji ffmpeg w rozwiązaniu jest zgodne z identyfikatorem i wersją pakietu ffmpeg przekazanego do konta usługi Batch. Przykład: ffmpeg i 4.3.1.

const string appPackageId = "ffmpeg";
const string appPackageVersion = "4.3.1";

Kompilowanie i uruchamianie przykładowego projektu

Skompiluj i uruchom aplikację w programie Visual Studio lub w wierszu polecenia, używając poleceń dotnet build i dotnet run. Po uruchomieniu aplikacji przejrzyj kod, aby poznać działanie poszczególnych części aplikacji. Na przykład w programie Visual Studio:

  1. Kliknij prawym przyciskiem myszy rozwiązanie w Eksplorator rozwiązań i wybierz pozycję Kompiluj rozwiązanie.

  2. Jeśli zostanie wyświetlony monit, potwierdź przywrócenie pakietów NuGet. Jeśli musisz pobrać brakujące pakiety, upewnij się, że zainstalowano menedżera pakietów NuGet.

  3. Uruchom rozwiązanie. Po uruchomieniu aplikacji przykładowej dane wyjściowe w konsoli będą wyglądać mniej więcej następująco. W czasie wykonywania nastąpi wstrzymanie operacji w momencie wyświetlenia komunikatu Monitoring all tasks for 'Completed' state, timeout in 00:30:00... podczas uruchamiania węzłów obliczeniowych puli.

Sample start: 11/19/2018 3:20:21 PM

Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [WinFFmpegPool]...
Creating job [WinFFmpegJob]...
Adding 5 tasks to job [WinFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks completed successfully within the specified timeout period.
Deleting container [input]...

Sample end: 11/19/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742

Przejdź do konta usługi Batch w witrynie Azure Portal, aby monitorować pulę, węzły obliczeniowe, zadanie i zadania podrzędne. Na przykład aby wyświetlić mapę cieplną węzłów obliczeniowych w puli, kliknij pozycję Pule>WinFFmpegPool.

Podczas wykonywania zadań podrzędnych mapa cieplna może wyglądać następująco:

Zrzut ekranu przedstawiający mapę cieplną puli w witrynie Azure Portal.

Typowy czas wykonywania wynosi mniej więcej 10 minut w przypadku uruchomienia aplikacji w konfiguracji domyślnej. Tworzenie puli zajmuje najwięcej czasu.

Pobieranie plików wyjściowych

Przy użyciu witryny Azure Portal można pobrać wyjściowe pliki MP3 wygenerowane przez zadania ffmpeg.

  1. Kliknij pozycję Wszystkie usługi>Konta usługi Storage i kliknij nazwę odpowiedniego konta usługi Storage.
  2. Kliknij pozycję Obiekty Blob>dane wyjściowe.
  3. Kliknij prawym przyciskiem myszy jeden z wyjściowych plików MP3, a następnie kliknij polecenie Pobierz. Postępuj zgodnie z monitami wyświetlanymi w przeglądarce, aby otworzyć lub zapisać plik.

Pobieranie pliku wyjściowego

Mimo że nie pokazano tego w tym przykładzie, pliki można również pobrać programowo z węzłów obliczeniowych lub z kontenera magazynu.

Przeglądanie kodu

W poniższych sekcjach przykładowa aplikacja została podzielona na kroki wykonywane w celu przetworzenia obciążenia w usłudze Batch. Zapoznaj się z plikiem Program.cs w rozwiązaniu podczas czytania pozostałej części tego artykułu, ponieważ nie omówiono każdego wiersza kodu w przykładzie.

Uwierzytelnianie klientów obiektów blob i usługi Batch

Aby korzystać z połączonego konta magazynu, aplikacja używa biblioteki Azure.Storage.Blobs dla platformy .NET. Korzystając z klasy BlobServiceClient, która przyjmuje odwołanie do identyfikatora URI konta i uwierzytelniania tokenu, takiego jak DefaultAzureCredential.

// TODO: Replace <storage-account-name> with your actual storage account name
Uri accountUri = new Uri("https://<storage-account-name>.blob.core.windows.net/");
BlobServiceClient blobClient = new BlobServiceClient(accountUri, new DefaultAzureCredential());

Aplikacja tworzy odwołanie do usługi BatchAccountResource za pośrednictwem klienta ArmClient usługi Resource Manager w celu utworzenia puli w usłudze Batch. Klient arm w przykładzie używa uwierzytelniania DefaultAzureCredential .

ArmClient _armClient = new ArmClient(new DefaultAzureCredential());
var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();

Aplikacja tworzy obiekt BatchClient w celu utworzenia zadań i zadań w usłudze Batch. Klient usługi Batch w przykładzie używa uwierzytelniania DefaultAzureCredential .

// TODO: Replace <batch-account-name> with your actual storage account name
Uri batchUri = new Uri("https://<batch-account-name>t.eastus.batch.azure.com");
BatchClient _batchClient = new BatchClient(batchUri, new DefaultAzureCredential());

Przekazywanie plików wejściowych

Aplikacja przekazuje obiekt blobServerClient do metody CreateContainerIfNotExistc w celu utworzenia kontenera magazynu dla plików wejściowych (w formacie MP4) oraz kontenera dla danych wyjściowych zadania podrzędnego.

CreateContainerIfNotExist(blobClient, inputContainerName);
CreateContainerIfNotExist(blobClient, outputContainerName);

Następnie pliki są przekazywane do kontenera wejściowego z lokalnego folderu InputFiles . Pliki w magazynie są definiowane jako obiekty ResourceFile usługi Batch, które następnie mogą być pobierane przez tę usługę do węzłów obliczeniowych.

Dwie metody w Program.cs są związane z przekazywaniem plików:

  • UploadFilesToContainerAsync: zwraca kolekcję ResourceFile obiektów i wewnętrznie wywołuje UploadResourceFileToContainerAsync metodę przekazywania każdego pliku przekazanego w parametrze inputFilePaths .
  • UploadResourceFileToContainerAsync: przekazuje poszczególne pliki jako obiekty blob do kontenera wejściowego. Po przekazaniu pliku uzyskuje sygnaturę dostępu współdzielonego (SAS) dla obiektu blob i zwraca ResourceFile obiekt, który ma go reprezentować.
string inputPath = Path.Combine(Environment.CurrentDirectory, "InputFiles");

List<string> inputFilePaths = new List<string>(Directory.GetFileSystemEntries(inputPath, "*.mp4",
    SearchOption.TopDirectoryOnly));

List<ResourceFile> inputFiles = await UploadFilesToContainerAsync(
  blobClient,
  inputContainerName,
  inputFilePaths);

Szczegółowe informacje na temat przekazywania plików jako obiektów blob na konto magazynu przy użyciu środowiska .NET zawiera artykuł Szybki start: przekazywanie, pobieranie i wyświetlanie listy obiektów blob za pomocą platformy .NET.

Tworzenie puli węzłów obliczeniowych

Następnie w przykładzie tworzona jest pula węzłów obliczeniowych na koncie usługi Batch z wywołaniem funkcji CreatePoolIfNotExistAsync. Ta zdefiniowana metoda używa klasy BatchAccountResource.GetBatchAccountPools(). CreateOrUpdateAsync metoda ustawiania liczby węzłów, rozmiaru maszyny wirtualnej i konfiguracji puli. W tym miejscu obiekt BatchVmConfiguration określa właściwość BatchImageReference do obrazu systemu Windows Server opublikowanego w witrynie Azure Marketplace. Usługa Batch obsługuje szeroki zakres obrazów maszyn wirtualnych z witryny Azure Marketplace oraz niestandardowe obrazy maszyn wirtualnych.

Liczba węzłów i rozmiar maszyny wirtualnej są ustawiane przy użyciu zdefiniowanych stałych. Usługa Batch obsługuje dedykowane węzły i węzły typu spot, a w pulach można używać obu tych węzłów. Węzły dedykowane są zarezerwowane dla Twojej puli. Węzły typu spot są oferowane w obniżonej cenie od nadwyżkowej pojemności maszyny wirtualnej na platformie Azure. Węzły typu spot stają się niedostępne, jeśli platforma Azure nie ma wystarczającej pojemności. Przykład domyślnie tworzy pulę zawierającą tylko 5 węzłów typu spot o rozmiarze Standard_A1_v2.

Uwaga

Upewnij się, że sprawdzasz przydziały węzłów. Aby uzyskać instrukcje dotyczące tworzenia żądania przydziału przydziału, zobacz Limity i limity usługi Batch.

Aplikacja ffmpeg jest wdrażana w węzłach obliczeniowych przez dodanie parametru ApplicationPackageReference do konfiguracji puli.

var credential = new DefaultAzureCredential();
ArmClient _armClient = new ArmClient(credential);

var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();

BatchAccountPoolCollection collection = batchAccount.GetBatchAccountPools();
if (collection.Exists(poolId) == false)
{
    var poolName = poolId;
    var imageReference = new BatchImageReference()
    {
        Publisher = "MicrosoftWindowsServer",
        Offer = "WindowsServer",
        Sku = "2019-datacenter-smalldisk",
        Version = "latest"
    };
    string nodeAgentSku = "batch.node.windows amd64";


    ArmOperation<BatchAccountPoolResource> armOperation = await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(
        WaitUntil.Completed, poolName, new BatchAccountPoolData()
        {
            VmSize = "Standard_DS1_v2",
            DeploymentConfiguration = new BatchDeploymentConfiguration()
            {
                VmConfiguration = new BatchVmConfiguration(imageReference, nodeAgentSku)
            },
            ScaleSettings = new BatchAccountPoolScaleSettings()
            {
                FixedScale = new BatchAccountFixedScaleSettings()
                {
                    TargetDedicatedNodes = DedicatedNodeCount,
                    TargetLowPriorityNodes = LowPriorityNodeCount
                }
            },
            Identity = new ManagedServiceIdentity(ManagedServiceIdentityType.UserAssigned)
            {
                UserAssignedIdentities =
                {
                        [new ResourceIdentifier(ManagedIdentityId)] = new Azure.ResourceManager.Models.UserAssignedIdentity(),
                },
            },
            ApplicationPackages =
            {
                    new Azure.ResourceManager.Batch.Models.BatchApplicationPackageReference(new ResourceIdentifier(appPacakgeResourceID))
                    {
                        Version = appPackageVersion,
                    }
            },

        });
    BatchAccountPoolResource pool = armOperation.Value;

Tworzenie zadania

Zadanie usługi Batch określa pulę, w której będą uruchamiane zadania podrzędne, wraz z ustawieniami opcjonalnymi, takimi jak priorytet i harmonogram pracy. Przykładowa aplikacja tworzy zadanie z wywołaniem CreateJobAsync. Ta zdefiniowana metoda używa metody BatchClient.CreateJobAsync do utworzenia zadania w puli.

 BatchJobCreateContent batchJobCreateContent = new BatchJobCreateContent(jobId, new BatchPoolInfo { PoolId = poolId });
 await batchClient.CreateJobAsync(batchJobCreateContent);

Tworzenie zadań

Przykład tworzy zadania w zadaniu z wywołaniem AddTasksAsync metody , która tworzy listę obiektów BatchTask . Każdy obiekt BatchTask uruchamia narzędzie ffmpeg w celu przetworzenia wejściowego obiektu ResourceFile za pomocą właściwości CommandLine. Narzędzie ffmpeg zostało już zainstalowane na wszystkich węzłach podczas tworzenia puli. Tutaj wiersz polecenia jest używany do uruchomienia narzędzia ffmpeg w celu przekonwertowania każdego z plików wejściowych w formacie MP4 (wideo) na format MP3 (audio).

Przykładowa aplikacja tworzy obiekt OutputFile dla pliku MP3 po uruchomieniu wiersza polecenia. Pliki wyjściowe z każdego zadania podrzędnego (w tym przypadku jeden plik) są przekazywane do kontenera na połączonym koncie magazynu przy użyciu właściwości OutputFiles w zadaniu podrzędnym. Zwróć uwagę na warunki ustawione dla obiektu outputFile. Plik wyjściowy z zadania jest przekazywany do kontenera tylko po pomyślnym zakończeniu zadania (OutputFileUploadCondition.TaskSuccess). Zobacz cały przykładowy kod w witrynie GitHub, aby uzyskać więcej informacji o szczegółach implementacji.

Następnie przykład dodaje zadania do zadania za pomocą metody CreateTaskAsync , która kolejkuje je do uruchomienia w węzłach obliczeniowych.

Zastąp ścieżkę pliku pliku wykonywalnego nazwą pobranej wersji. W tym przykładowym kodzie użyto przykładu ffmpeg-4.3.1-2020-11-08-full_build.

// Create a collection to hold the tasks added to the job:
List<BatchTaskCreateContent> tasks = new List<BatchTaskCreateContent>();

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 MP3 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].StorageContainerUrl;
    string outputMediaFile = String.Format("{0}{1}",
        System.IO.Path.GetFileNameWithoutExtension(inputMediaFile),
        ".mp3");
    string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-4.3.1-2020-11-08-full_build\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile);

    // Create a batch task (with the task ID and command line) and add it to the task list

    BatchTaskCreateContent batchTaskCreateContent = new BatchTaskCreateContent(taskId, taskCommandLine);
    batchTaskCreateContent.ResourceFiles.Add(inputFiles[i]);

    // Task output file will be uploaded to the output container in Storage.
    // TODO: Replace <storage-account-name> with your actual storage account name
    OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination("https://<storage-account-name>.blob.core.windows.net/output/" + outputMediaFile)
    {
        IdentityReference = inputFiles[i].IdentityReference,
    };

    OutputFile outputFile = new OutputFile(outputMediaFile,
                                           new OutputFileDestination() { Container = outputContainer },
                                           new OutputFileUploadConfig(OutputFileUploadCondition.TaskSuccess));
    batchTaskCreateContent.OutputFiles.Add(outputFile);

    tasks.Add(batchTaskCreateContent);
}

// Call BatchClient.CreateTaskCollectionAsync() 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.CreateTaskCollectionAsync(jobId, new BatchTaskGroup(tasks));

Czyszczenie zasobów

Po wykonaniu zadań podrzędnych aplikacja automatycznie usuwa utworzony wejściowy kontener magazynu, a opcjonalnie także pulę i zadanie usługi Batch. Klasa BatchClient ma metodę usuwania zadania DeleteJobAsync i usuwania puli DeletePoolAsync, które są wywoływane w przypadku potwierdzenia usunięcia. Mimo że nie są naliczane opłaty za same zadania i zadania podrzędne, są naliczane opłaty za węzły obliczeniowe. W związku z tym zaleca się przydzielanie pul stosownie do potrzeb. W przypadku usunięcia puli usuwane są również wszystkie dane wyjściowe zadań podrzędnych w węzłach. Pliki wyjściowe pozostają jednak na koncie magazynu.

Gdy grupa zasobów, konto usługi Batch i konto magazynu nie będą już potrzebne, usuń je. W tym celu w witrynie Azure Portal zaznacz grupę zasobów konta usługi Batch i kliknij pozycję Usuń grupę zasobów.

Następne kroki

W tym samouczku zawarto informacje na temat wykonywania następujących czynności:

  • Dodaj pakiet aplikacji do konta usługi Batch.
  • Uwierzytelnianie przy użyciu kont usługi Batch i usługi Storage.
  • Przekazywanie plików wejściowych do usługi Storage.
  • Utwórz pulę węzłów obliczeniowych, aby uruchomić aplikację.
  • Utwórz zadanie i zadania przetwarzania plików wejściowych.
  • Monitorowanie wykonywania zadań.
  • Pobieranie plików wyjściowych.

Aby uzyskać więcej przykładów użycia interfejsu API platformy .NET do planowania i przetwarzania obciążeń usługi Batch, zobacz przykłady języka C# usługi Batch w witrynie GitHub.