Szybki start: tworzenie puli usługi Batch i uruchamianie zadania przy użyciu platformy .NET

W tym przewodniku Szybki start pokazano, jak rozpocząć pracę z usługą Azure Batch, uruchamiając aplikację w języku C#, która korzysta z interfejsu API platformy .NET usługi Azure Batch. Aplikacja .NET:

  • Przekazuje kilka plików danych wejściowych do kontenera obiektów blob usługi Azure Storage do użycia na potrzeby przetwarzania zadań usługi Batch.
  • Tworzy pulę dwóch maszyn wirtualnych (maszyn wirtualnych) lub węzłów obliczeniowych z systemem Windows Server.
  • Tworzy zadanie uruchamiające zadania podrzędne w węzłach w celu przetworzenia każdego pliku wejściowego przy użyciu wiersza polecenia systemu Windows.
  • Wyświetla pliki wyjściowe zwracane przez zadania.

Po ukończeniu tego przewodnika Szybki start zapoznasz się z kluczowymi pojęciami usługi Batch i możesz przystąpić do korzystania z usługi Batch z bardziej realistycznymi, większymi obciążeniami na dużą skalę.

Wymagania wstępne

Uruchom aplikację

Aby ukończyć ten przewodnik Szybki start, pobierz lub sklonujesz aplikację, podaj wartości konta, skompiluj i uruchom aplikację oraz zweryfikuj dane wyjściowe.

Pobieranie lub klonowanie aplikacji

Pobierz lub sklonuj aplikację Szybki start platformy .NET usługi Azure Batch z usługi GitHub. Użyj następującego polecenia, aby sklonować repozytorium aplikacji z klientem Git:

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

Podaj informacje o koncie

Aplikacja musi używać nazw kont usługi Batch i magazynu, wartości kluczy konta i punktu końcowego konta usługi Batch. Te informacje można uzyskać z witryny Azure Portal, interfejsów API platformy Azure lub narzędzi wiersza polecenia.

Aby uzyskać informacje o koncie z witryny Azure Portal:

  1. Na pasku usługi Azure Search wyszukaj i wybierz nazwę konta usługi Batch.
  2. Na stronie Konto usługi Batch wybierz pozycję Klucze w obszarze nawigacji po lewej stronie.
  3. Na stronie Klucze skopiuj następujące wartości:
  • Konto usługi Batch
  • Punkt końcowy konta
  • Podstawowy klucz dostępu
  • Nazwa konta magazynu
  • Klucz1

Przejdź do pobranego folderu batch-dotnet-quickstart i edytuj ciągi poświadczeń w pliku Program.cs , aby podać skopiowane wartości:

// Batch account credentials
private const string BatchAccountName = "<batch account>";
private const string BatchAccountKey  = "<primary access key>";
private const string BatchAccountUrl  = "<account endpoint>";

// Storage account credentials
private const string StorageAccountName = "<storage account name>";
private const string StorageAccountKey  = "<key1>

Ważne

Udostępnianie kluczy kont w źródle aplikacji nie jest zalecane w przypadku użycia produkcyjnego. Należy ograniczyć dostęp do poświadczeń i odwołać się do nich w kodzie przy użyciu zmiennych lub pliku konfiguracji. Najlepiej przechowywać klucze kont usługi Batch i magazynu w usłudze Azure Key Vault.

Kompilowanie i uruchamianie aplikacji oraz wyświetlanie danych wyjściowych

Aby zobaczyć, jak działa przepływ pracy usługi Batch, skompiluj i uruchom aplikację w programie Visual Studio. Możesz również użyć wiersza dotnet build polecenia i dotnet run poleceń.

W programie Visual Studio:

  1. Otwórz plik BatchDotNetQuickstart.sln, kliknij prawym przyciskiem myszy rozwiązanie w Eksplorator rozwiązań, a następnie wybierz pozycję Kompiluj. Jeśli zostanie wyświetlony monit, użyj Menedżer pakietów NuGet, aby zaktualizować lub przywrócić pakiety NuGet.

  2. Po zakończeniu kompilacji wybierz pozycję BatchDotNetQuickstart na górnym pasku menu, aby uruchomić aplikację.

Typowy czas wykonywania z domyślną konfiguracją wynosi około pięciu minut. Konfiguracja początkowego węzła puli zajmuje jak najwięcej czasu. Aby ponownie uruchomić zadanie, usuń zadanie z poprzedniego uruchomienia, ale nie usuwaj puli. We wstępnie skonfigurowanej puli zadanie zostanie ukończone w ciągu kilku sekund.

Aplikacja zwraca dane wyjściowe podobne do następującego przykładu:

Sample start: 11/16/2022 4:02:54 PM

Container [input] created.
Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [DotNetQuickstartPool]...
Creating job [DotNetQuickstartJob]...
Adding 3 tasks to job [DotNetQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

Podczas uruchamiania węzłów obliczeniowych puli jest wstrzymana Monitoring all tasks for 'Completed' state, timeout in 00:30:00... . W miarę tworzenia zadań usługa Batch kolejkuje je do uruchomienia w puli. Gdy tylko pierwszy węzeł obliczeniowy jest dostępny, pierwsze zadanie jest uruchamiane w węźle. Stan węzła, zadania i zadania można monitorować na stronie konta usługi Batch w witrynie Azure Portal.

Po zakończeniu każdego zadania zobaczysz dane wyjściowe podobne do następującego przykładu:

Printing task output.
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard out:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...
stderr:
...

Przeglądanie kodu

Zapoznaj się z kodem, aby poznać kroki opisane w przewodniku Szybki start dla platformy .NET usługi Azure Batch.

Tworzenie klientów usługi i przekazywanie plików zasobów

  1. Aby korzystać z konta magazynu, aplikacja używa biblioteki klienta obiektów blob usługi Azure Storage dla platformy .NET do utworzenia obiektu blobServiceClient.

    var sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);
    string blobUri = "https://" + storageAccountName + ".blob.core.windows.net";
    
    var blobServiceClient = new BlobServiceClient(new Uri(blobUri), sharedKeyCredential);
    return blobServiceClient;
    
  2. Aplikacja używa blobServiceClient odwołania do tworzenia kontenera na koncie magazynu i przekazywania plików danych do kontenera. Pliki w magazynie są definiowane jako obiekty ResourceFile usługi Batch, które usługa Batch może później pobrać do węzłów obliczeniowych.

    List<string> inputFilePaths = new()
    {
        "taskdata0.txt",
        "taskdata1.txt",
        "taskdata2.txt"
    };
    
    var inputFiles = new List<ResourceFile>();
    
    foreach (var filePath in inputFilePaths)
    {
        inputFiles.Add(UploadFileToContainer(containerClient, inputContainerName, filePath));
    }
    
  3. Aplikacja tworzy obiekt BatchClient w celu tworzenia pul, zadań i zadań usługi Batch oraz zarządzania nimi. Klient usługi Batch używa uwierzytelniania klucza współużytkowanego. Usługa Batch obsługuje również uwierzytelnianie firmy Microsoft Entra.

    var cred = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);
    
     using BatchClient batchClient = BatchClient.Open(cred);
    ...
    

Tworzenie puli węzłów obliczeniowych

Aby utworzyć pulę usługi Batch, aplikacja używa metody BatchClient.PoolOperations.CreatePool w celu ustawienia liczby węzłów, rozmiaru maszyny wirtualnej i konfiguracji puli. Poniższy obiekt VirtualMachineConfiguration określa imageReference do obrazu witryny Marketplace systemu Windows Server. Usługa Batch obsługuje szeroką gamę obrazów systemu operacyjnego Windows Server i Linux Marketplace, a także obsługuje niestandardowe obrazy maszyn wirtualnych.

Rozmiar PoolNodeCount maszyny wirtualnej PoolVMSize i są definiowane stałe. Aplikacja tworzy pulę dwóch węzłów Standard_A1_v2. Ten rozmiar zapewnia dobrą równowagę między wydajnością a kosztami dla tego przewodnika Szybki start.

Metoda Commit przesyła pulę do usługi Batch.


private static VirtualMachineConfiguration CreateVirtualMachineConfiguration(ImageReference imageReference)
{
    return new VirtualMachineConfiguration(
        imageReference: imageReference,
        nodeAgentSkuId: "batch.node.windows amd64");
}

private static ImageReference CreateImageReference()
{
    return new ImageReference(
        publisher: "MicrosoftWindowsServer",
        offer: "WindowsServer",
        sku: "2016-datacenter-smalldisk",
        version: "latest");
}

private static void CreateBatchPool(BatchClient batchClient, VirtualMachineConfiguration vmConfiguration)
{
    try
    {
        CloudPool pool = batchClient.PoolOperations.CreatePool(
            poolId: PoolId,
            targetDedicatedComputeNodes: PoolNodeCount,
            virtualMachineSize: PoolVMSize,
            virtualMachineConfiguration: vmConfiguration);

        pool.Commit();
    }
...

Utworzenie zadania usługi Batch

Zadanie usługi Batch to logiczna grupa zawierająca co najmniej jedno zadanie podrzędne. Zadanie zawiera ustawienia wspólne dla zadań, takich jak priorytet i pula do uruchamiania zadań podrzędnych.

Aplikacja tworzy zadanie w puli za pomocą metody BatchClient.JobOperations.CreateJob. Metoda Commit przesyła zadanie do usługi Batch. Początkowo zadanie nie zawiera zadań podrzędnych.

try
{
    CloudJob job = batchClient.JobOperations.CreateJob();
    job.Id = JobId;
    job.PoolInformation = new PoolInformation { PoolId = PoolId };

    job.Commit();
}
...

Tworzenie zadań

Usługa Batch udostępnia kilka sposobów wdrażania aplikacji i skryptów w węzłach obliczeniowych. Ta aplikacja tworzy listę obiektów wejściowych ResourceFile CloudTask. Każde zadanie przetwarza plik wejściowy przy użyciu właściwości CommandLine . Wiersz polecenia usługi Batch to miejsce, w którym określasz aplikację lub skrypt.

Wiersz polecenia w poniższym kodzie uruchamia polecenie systemu Windows type , aby wyświetlić pliki wejściowe. Następnie aplikacja dodaje każde zadanie do zadania za pomocą metody AddTask , która kolejkuje zadanie do uruchomienia w węzłach obliczeniowych.

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);
    string inputFilename = inputFiles[i].FilePath;
    string taskCommandLine = String.Format("cmd /c type {0}", inputFilename);

    var task = new CloudTask(taskId, taskCommandLine)
    {
        ResourceFiles = new List<ResourceFile> { inputFiles[i] }
    };
    tasks.Add(task);
}

batchClient.JobOperations.AddTask(JobId, tasks);

Wyświetlanie danych wyjściowych zadania podrzędnego

Aplikacja tworzy element TaskStateMonitor , aby monitorować zadania i upewnić się, że zostały wykonane. Po pomyślnym uruchomieniu każdego zadania jego dane wyjściowe są zapisywane w pliku stdout.txt. Następnie aplikacja używa właściwości CloudTask.ComputeNodeInformation do wyświetlania pliku stdout.txt dla każdego ukończonego zadania.

foreach (CloudTask task in completedtasks)
{
    string nodeId = String.Format(task.ComputeNodeInformation.ComputeNodeId);
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    Console.WriteLine(task.GetNodeFile(Constants.StandardOutFileName).ReadAsString());
}

Czyszczenie zasobów

Aplikacja automatycznie usuwa utworzony kontener magazynu, a także udostępnia opcję usunięcia puli i zadania usługi Batch. Pule i węzły są naliczane opłaty, gdy węzły są uruchomione, nawet jeśli nie są uruchomione zadania. Jeśli pula nie jest już potrzebna, usuń ją.

Jeśli nie potrzebujesz już konta usługi Batch i konta magazynu, możesz usunąć grupę zasobów, która je zawiera. W witrynie Azure Portal wybierz pozycję Usuń grupę zasobów w górnej części strony grupy zasobów. Na ekranie Usuwanie grupy zasobów wprowadź nazwę grupy zasobów, a następnie wybierz pozycję Usuń.

Następne kroki

W tym przewodniku Szybki start uruchomiono aplikację, która używa interfejsu API .NET usługi Batch do tworzenia puli, węzłów, zadań i zadań usługi Batch. Zadanie przesłało pliki zasobów do kontenera magazynu, uruchamiało zadania w węzłach i wyświetlało dane wyjściowe z węzłów.

Teraz, gdy rozumiesz kluczowe pojęcia usługi Batch, możesz przystąpić do korzystania z usługi Batch z bardziej realistycznymi, większymi obciążeniami na dużą skalę. Aby dowiedzieć się więcej na temat usługi Azure Batch i zapoznać się z równoległym obciążeniem za pomocą rzeczywistej aplikacji, przejdź do samouczka dotyczącego platformy .NET usługi Batch.