Udostępnij przez


Szybki start: Użyj .NET, aby utworzyć pulę Batch i uruchomić zadanie

Ten przewodnik pokazuje, jak rozpocząć pracę z Azure Batch, uruchamiając aplikację C# z wykorzystaniem Azure Batch .NET API. Aplikacja .NET:

  • Wysyła kilka plików danych wejściowych do kontenera obiektu blob w Azure Storage, aby używać ich do przetwarzania zadań Batch.
  • Tworzy pulę dwóch maszyn wirtualnych (VM) lub węzłów obliczeniowych działających na Windows Server.
  • Tworzy zadanie, które uruchamia zadania na węzłach do przetwarzania każdego pliku wejściowego za pomocą wiersza poleceń Windows.
  • Wyświetla pliki wynikowe, które zwracają zadania.

Po ukończeniu tego przewodnika szybkiego startu, zapoznasz się z kluczowymi pojęciami usługi Batch, dzięki czemu będziesz gotowy do korzystania z Batch przy bardziej realistycznych obciążeniach na dużą skalę.

Wymagania wstępne

Uruchom aplikację

Aby ukończyć ten przewodnik wstępny, pobierz lub sklonuj aplikację, podaj wartości swojego konta, zbuduj i uruchom aplikację, a następnie sprawdź wynik.

Pobierz lub sklonuj aplikację

Pobierz lub sklonuj aplikację Azure Batch .NET Quickstart z GitHub. Użyj następującego polecenia, aby sklonować repozytorium aplikacji za pomocą klienta Git:

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

Podaj informacje o swoim koncie

Aplikacja musi używać nazw Twoich kont Batch i Storage, wartości kluczy kont i punktu końcowego konta Batch. Możesz uzyskać te informacje z portalu Azure, interfejsów API Azure lub narzędzi wiersza poleceń.

Aby uzyskać informacje o swoim koncie z portalu Azure:

  1. Na pasku usługi Azure Search wyszukaj i wybierz nazwę konta usługi Batch.
  2. Na stronie konta Batch wybierz pozycję Klucze z lewego menu nawigacyjnego.
  3. Na stronie Klucze skopiuj następujące wartości:
  • Konto zbiorcze
  • 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 wprowadzić 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 kont magazynów w usłudze Azure Key Vault.

Zbuduj i uruchom aplikację, a następnie zobacz wyniki

Aby zobaczyć działanie przepływu Batch, zbuduj i uruchom aplikację w Visual Studio. Możesz także użyć poleceń dotnet build i dotnet run w wierszu poleceń.

W programie Visual Studio:

  1. Otwórz plik BatchDotNetQuickstart.sln, kliknij prawym przyciskiem myszy na rozwiązanie w Eksploratorze rozwiązań i wybierz Kompiluj. Jeśli zostaniesz o to poproszony, użyj NuGet Package Manager, aby zaktualizować lub przywrócić pakiety NuGet.

  2. Po zakończeniu budowania wybierz BatchDotNetQuickstart w górnym pasku menu, aby uruchomić aplikację.

Typowy czas pracy z domyślną konfiguracją wynosi około pięciu minut. Początkowa konfiguracja węzła puli zajmuje najwięcej czasu. Aby ponownie uruchomić zadanie, usuń zadanie z poprzedniego uruchomienia, ale nie usuwaj zasobnika. Na wcześniej skonfigurowanej puli zadanie zostaje ukończone w kilka sekund.

Aplikacja zwraca wynik podobny do poniższego 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...

Występuje pauza przy Monitoring all tasks for 'Completed' state, timeout in 00:30:00..., podczas gdy węzły obliczeniowe puli się uruchamiają. W miarę tworzenia zadań, Batch umieszcza je w kolejce do uruchomienia na puli. Gdy tylko pierwszy węzeł obliczeniowy będzie dostępny, na tym węźle uruchomi się pierwsze zadanie. Możesz monitorować stan węzłów, zadań i procesów na stronie konta Batch w portalu Azure.

Po zakończeniu każdego zadania zobaczysz wyniki podobne do poniższego 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

Przejrzyj kod, aby zrozumieć kroki w Azure Batch .NET Quickstart.

Utwórz klientów usługi i prześlij pliki zasobów

  1. Aby uzyskać dostęp do konta magazynowego, aplikacja używa biblioteki klienta Azure Storage Blobs dla .NET do utworzenia 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 wykorzystuje blobServiceClient odniesienie do utworzenia kontenera w koncie magazynowym, a następnie przesłania pliki danych do kontenera. Pliki w pamięci masowej są definiowane jako obiekty Batch ResourceFile, które Batch może później pobrać na węzły obliczeniowe.

    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 do tworzenia i zarządzania pulami, zadaniami i operacjami Batch. Klient Batch używa uwierzytelniania za pomocą wspólnego klucza. 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ę Batch, aplikacja używa metody BatchClient.PoolOperations.CreatePool do ustawienia liczby węzłów, rozmiaru VM i konfiguracji puli. Następujący obiekt VirtualMachineConfiguration określa ImageReference do obrazu Windows Server Marketplace. Usługa Batch obsługuje szeroki zakres obrazów systemów operacyjnych Windows Server i Linux Marketplace, a także obsługuje niestandardowe obrazy maszyn wirtualnych (VM).

PoolNodeCount i rozmiar maszyny wirtualnej PoolVMSize są zdefiniowanymi stałymi. Aplikacja tworzy pulę z dwóch węzłów Standard_A1_v2. Ten rozmiar oferuje dobrą równowagę między wydajnością a kosztem dla tego szybkiego startu.

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

Utwórz zadanie wsadowe

Zadanie wsadowe to logiczna grupa jednej lub więcej zadań. Praca obejmuje ustawienia wspólne dla zadań, takie jak priorytet i pula do uruchamiania zadań.

Aplikacja używa metody BatchClient.JobOperations.CreateJob, aby utworzyć zadanie w twojej grupie. Metoda Commit przesyła zadanie do usługi Batch. Początkowo praca nie ma zadań.

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 CloudTaskResourceFile. Każde zadanie przetwarza plik wejściowy przy użyciu właściwości CommandLine. W wierszu poleceń Batch określasz swoją aplikację lub skrypt.

Wiersz poleceń w poniższym kodzie uruchamia polecenie Windows type w celu wyświetlenia plików wejściowych. Następnie aplikacja dodaje każde zadanie do zadania przy użyciu metody AddTask, która ustawia zadanie w kolejce do uruchomienia na 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świetl dane wyjściowe zadania

Aplikacja tworzy TaskStateMonitor, aby monitorować zadania i upewnić się, że zostaną wykonane. Kiedy każde zadanie zakończy się pomyślnie, jego wyniki są zapisywane do stdout.txt. Aplikacja następnie używa właściwości CloudTask.ComputeNodeInformation, aby wyświetlić plik 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 przez siebie kontener pamięci masowej i daje możliwość usunięcia zasobu Batch oraz zadania. Pule i węzły ponoszą opłaty, gdy węzły są uruchomione, nawet jeśli nie wykonują zadań. Jeśli nie potrzebujesz już basenu, usuń go.

Kiedy nie potrzebujesz już swojego konta Batch i konta pamięci masowej, możesz usunąć grupę zasobów, która je zawiera. W portalu Azure wybierz Usuń grupę zasobów na górze 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 szybkiego startu uruchomiono aplikację, która korzysta z interfejsu Batch .NET API do utworzenia puli Batch, węzłów, zadania i zadań. Zadanie przesłało pliki zasobów do kontenera magazynującego, wykonało zadania na węzłach i wyświetlił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 o Azure Batch i przejść przez równoległe obciążenie z rzeczywistą aplikacją, przejdź do samouczka Batch .NET.