Schnellstart: Verwenden von .NET zum Erstellen eines Batchpools und Ausführen eines Auftrags

In dieser Schnellstartanleitung erfahren Sie, wie Sie mit Azure Batch beginnen, indem Sie eine C#-App ausführen, die die Azure Batch .NET-API verwendet. Die .NET-App:

  • Lädt mehrere Eingabedatendateien in einen Azure Storage-BLOB-Container hoch, der für die Verarbeitung von Batchaufgaben verwendet werden soll.
  • Erstellt einen Pool von zwei virtuellen Computern (VMs) oder Computeknoten, auf denen Windows Server ausgeführt wird.
  • Erstellt einen Auftrag, der Aufgaben auf den Knoten ausführt, um jede Eingabedatei mithilfe einer Windows-Befehlszeile zu verarbeiten.
  • Zeigt die Ausgabedateien an, die die Aufgaben zurückgeben.

Nachdem Sie diese Schnellstartanleitung abgeschlossen haben, sind Sie mit den wichtigsten Konzepten des Batch-Diensts vertraut und verwenden Batch mit realistischeren, umfangreicheren Workloads.

Voraussetzungen

App starten

Um diese Schnellstartanleitung abzuschließen, laden Sie die App herunter oder klonen sie, geben Sie Ihre Kontowerte an, erstellen und führen Sie die App aus, und überprüfen Sie die Ausgabe.

Herunterladen oder Klonen der App

Laden Sie die Azure Batch .NET-Schnellstart-App von GitHub herunter, oder klonen Sie sie. Verwenden Sie den folgenden Befehl, um das App-Repository mit einem Git-Client zu klonen:

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

Geben Sie Ihre Kontoinformationen an

Die App muss Ihre Batch- und Speicherkontonamen, Kontoschlüsselwerte und Batchkontoendpunkt verwenden. Sie können diese Informationen über das Azure-Portal, Azure-APIs oder Befehlszeilentools abrufen.

So rufen Sie Ihre Kontoinformationen aus dem Azure-Portal ab:

  1. Suchen Sie in der Azure Search-Leiste nach dem Namen Ihres Batch-Kontos, und wählen Sie ihn aus.
  • Batch-Konto
  • Kontoendpunkt
  • Name des Speicherkontos
  • Abonnement-ID
  • Ressourcengruppenname

Navigieren Sie zu Ihrem heruntergeladenen Batch-Dotnet-Schnellstartordner , und bearbeiten Sie die Anmeldeinformationszeichenfolgen in Program.cs , um die werte bereitzustellen, die Sie kopiert haben:

// Batch account credentials
const string BatchAccountName = "<batch account>";
const string BatchAccountUrl  = "<account endpoint>";

// Azure Resource Manager credentials for the Batch account
const string SubscriptionId    = "<subscription ID>";
const string ResourceGroupName = "<resource group name>";

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

Erstellen und Ausführen der App und Anzeigen der Ausgabe

Um den Batchworkflow in Aktion anzuzeigen, erstellen Sie die Anwendung in Visual Studio, und führen Sie sie aus. Sie können auch die Befehlszeile dotnet build und dotnet run Befehle verwenden.

In Visual Studio:

  1. Öffnen Sie die Datei BatchDotNetQuickstart.sln, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Lösung, und wählen Sie Erstellen aus. Wenn Sie dazu aufgefordert werden, verwenden Sie den NuGet-Paket-Manager , um NuGet-Pakete zu aktualisieren oder wiederherzustellen.

  2. Nachdem der Build abgeschlossen ist, wählen Sie "BatchDotNetQuickstart" in der oberen Menüleiste aus, um die App auszuführen.

Die typische Laufzeit mit der Standardkonfiguration beträgt ungefähr fünf Minuten. Am meisten Zeit nimmt die anfängliche Einrichtung der Poolknoten ein. Um den Auftrag erneut auszuführen, löschen Sie den Auftrag aus der vorherigen Ausführung, aber löschen Sie den Pool nicht. Bei einem vorkonfigurierten Pool wird der Auftrag in ein paar Sekunden abgeschlossen.

Die App gibt eine Ausgabe ähnlich wie im folgenden Beispiel zurück:

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...

Es entsteht eine Pause bei Monitoring all tasks for 'Completed' state, timeout in 00:30:00..., während die Computeknoten des Pools starten. Wenn Aufgaben erstellt werden, reiht Batch sie in die Warteschlange ein, um sie im Pool auszuführen. Sobald der erste Computeknoten verfügbar ist, wird die erste Aufgabe auf dem Knoten ausgeführt. Sie können den Knoten-, Aufgaben- und Auftragsstatus auf Der Seite "Batchkonto" im Azure-Portal überwachen.

Nach Abschluss jeder Aufgabe wird eine Ausgabe angezeigt, die dem folgenden Beispiel ähnlich ist.

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:
...

Überprüfen des Codes

Überprüfen Sie den Code, um die Schritte in der Azure Batch .NET-Schnellstartanleitung zu verstehen.

Erstellen von Dienstclients und Hochladen von Ressourcendateien

  1. Um mit dem Speicherkonto zu interagieren, verwendet die App die Azure Storage Blobs-Clientbibliothek für .NET, um einen BlobServiceClient zu erstellen.

    string blobUri = "https://" + storageAccountName + ".blob.core.windows.net";
    
    var blobServiceClient = new BlobServiceClient(new Uri(blobUri), new DefaultAzureCredential());
    return blobServiceClient;
    
  2. Die App verwendet den blobServiceClient Verweis, um einen Container im Speicherkonto zu erstellen und Datendateien in den Container hochzuladen. Die Dateien im Speicher werden als Batch ResourceFile-Objekte definiert, die Batch später auf die Computeknoten herunterladen kann.

    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. Die App erstellt ein BatchClient-Objekt aus dem Azure. Compute.Batchbibliothek zum Erstellen und Verwalten von Batchaufträgen und -aufgaben. Der Batchclient verwendet Microsoft Entra Authentifizierung.

    BatchClient batchClient = new BatchClient(new Uri(BatchAccountUrl), new DefaultAzureCredential());
    ...
    
  4. Die App verwendet auch die Bibliothek Azure.ResourceManager.Batch, um das Batch-Konto und seine Pools zu verwalten. Es erstellt einen ArmClient und erhält einen Verweis auf BatchAccountResource für das Batch-Konto unter Verwendung der Abonnement-ID, des Ressourcengruppennamens und des Batch-Kontonamens.

    ArmClient armClient = new ArmClient(new DefaultAzureCredential());
    
    ResourceIdentifier batchAccountIdentifier = BatchAccountResource.CreateResourceIdentifier(
        SubscriptionId,
        ResourceGroupName,
        BatchAccountName);
    
    BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountIdentifier);
    

Erstellen eines Pools mit Computeknoten

Zum Erstellen eines Batchpools verwendet die App die BatchAccountPoolCollection.CreateOrUpdateAsync-Methode , um die Anzahl von Knoten, VM-Größe und Poolkonfiguration festzulegen. Das folgende BatchVmConfiguration-Objekt gibt ein BatchImageReference für ein Windows Server Marketplace-Bild an. Batch unterstützt eine vielzahl von Windows Server- und Linux Marketplace-Betriebssystemimages und unterstützt auch benutzerdefinierte VM-Images.

Die PoolNodeCount Größe und die VM-Größe PoolVMSize sind definierte Konstanten. Die App erstellt einen Pool von zwei Standard_A1_v2 Knoten. Diese Größe bietet für diesen Schnellstart ein gutes Preis-Leistungs-Verhältnis.

BatchImageReference imageReference = new BatchImageReference()
{
    Publisher = "MicrosoftWindowsServer",
    Offer = "WindowsServer",
    Sku = "2016-datacenter-smalldisk",
    Version = "latest"
};

BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.windows amd64");

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = PoolVMSize,
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = PoolNodeCount }
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, PoolId, poolData);

Erstellen eines Batchauftrags

Ein Batchauftrag ist eine logische Gruppierung einer oder mehrerer Aufgaben. Die Aufgabe umfasst gängige Einstellungen für Aufgaben, wie Priorität und den Pool, auf dem die Aufgaben ausgeführt werden sollen.

Die App verwendet BatchClient.CreateJobAsync, um einen Auftrag in Ihrem Pool zu erstellen. Zunächst hat der Job keine Aufgaben.

BatchJobCreateOptions job = new BatchJobCreateOptions(JobId, new BatchPoolInfo() { PoolId = PoolId });
await batchClient.CreateJobAsync(job);

Aufgaben erstellen

Batch bietet mehrere Möglichkeiten, Apps und Skripts auf Computeknoten zu deployen. Diese App erstellt eine Liste von BatchTaskCreateOptions-EingabeobjektenResourceFile. Jede Aufgabe verarbeitet eine Eingabedatei mithilfe einer CommandLine-Eigenschaft . In der Befehlszeile "Batch" geben Sie Ihre App oder Ihr Skript an.

Die Befehlszeile im folgenden Code führt den Windows-Befehl type aus, um die Eingabedateien anzuzeigen. Anschließend fügt die App die Aufgaben dem Auftrag mit BatchClient.CreateTasksAsync hinzu, wodurch die Aufgaben in die Warteschlange gestellt werden, die auf den Computeknoten ausgeführt werden sollen.

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

    BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId, taskCommandLine)
    {
        ResourceFiles = { inputFiles[i] }
    };
    tasks.Add(task);
}

await batchClient.CreateTasksAsync(JobId, tasks);

Aufgabenausgabe anzeigen

Die App wartet auf den Abschluss der Aufgaben. Wenn eine Aufgabe erfolgreich ausgeführt wird, schreibt ihre Ausgabe in stdout.txt. Die App verwendet dann die BatchTask.NodeInfo-Eigenschaft , um die stdout.txt Datei für jede abgeschlossene Aufgabe anzuzeigen.

await foreach (BatchTask task in batchClient.GetTasksAsync(JobId))
{
    string nodeId = task.NodeInfo?.NodeId ?? "<unknown>";
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    BinaryData stdout = await batchClient.GetTaskFileAsync(JobId, task.Id, "stdout.txt");
    Console.WriteLine(stdout.ToString());
}

Bereinigen von Ressourcen

Die App löscht automatisch den erstellten Speichercontainer und bietet Ihnen die Möglichkeit, den Batchpool und den Auftrag zu löschen. Für Pools und Knoten fallen Gebühren an, während die Knoten ausgeführt werden, auch wenn sie keine Aufträge ausführen. Wenn Sie den Pool nicht mehr benötigen, löschen Sie ihn.

Wenn Sie Ihr Batchkonto und Speicherkonto nicht mehr benötigen, können Sie die Ressourcengruppe löschen, die sie enthält. Wählen Sie im Azure-Portal oben auf der Seite "Ressourcengruppe löschen " aus. Geben Sie auf dem Bildschirm " Ressourcengruppe löschen" den Namen der Ressourcengruppe ein, und wählen Sie dann "Löschen" aus.

Nächste Schritte

In dieser Schnellstartanleitung haben Sie eine App ausgeführt, die die Batch-.NET-API verwendet, um einen Batchpool, Knoten, Auftrag und Aufgaben zu erstellen. Der Auftrag lud Ressourcendateien in einen Speichercontainer hoch, führte Aufgaben auf den Knotenpunkten aus und zeigte die Ausgabe von diesen an.

Da Sie sich jetzt mit den wichtigsten Konzepten des Batch-Diensts vertraut gemacht haben, können Sie Batch mit realistischeren, umfangreicheren Workloads verwenden. Um mehr über Azure Batch zu erfahren und eine parallele Workload mit einer realen Anwendung zu durchlaufen, gehen Sie zum Batch .NET Tutorial über.