Schnellstart: Verwenden von Python zum Erstellen eines Batch-Pools und Ausführen eines Auftrags

In dieser Schnellstartanleitung erfahren Sie, wie Sie in Azure Batch einsteigen, indem Sie eine App ausführen, die die Azure Batch-Bibliotheken für Python verwendet. Die Python-App erfüllt folgende Aufgaben:

  • Sie lädt mehrere Eingabedatendateien in einen Azure Storage-Blobcontainer hoch, der für die Batch-Aufgabenverarbeitung verwendet werden soll.
  • Sie erstellt einen Pool mit zwei VMs oder Computeknoten unter dem Betriebssystem Ubuntu 20.04 LTS.
  • Es werden ein Auftrag und drei Aufgaben für die Ausführung auf den Knoten erstellt. Jede Aufgabe verarbeitet eine der Eingabedateien über eine Befehlszeile der Bash-Shell.
  • Sie zeigt die Ausgabedateien an, die von den Aufgaben zurückgegeben werden.

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

Voraussetzungen

Ausführen der App

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

Herunterladen oder Klonen der App

  1. Laden Sie die App für den Azure Batch-Python-Schnellstart 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-python-quickstart.git
    
  2. Wechseln Sie zum Ordner batch-python-quickstart/src, und installieren Sie die erforderlichen Pakete mithilfe von pip.

    pip install -r requirements.txt
    

Bereitstellen Ihrer Kontoinformationen

Die Python-App muss Ihre Batch- und Storage-Kontonamen, Ihre Kontoschlüsselwerte und Ihren Batch-Kontoendpunkt verwenden. Sie können diese Informationen über das Azure-Portal, die Azure-APIs oder Befehlszeilentools abrufen.

So rufen Sie Ihre Kontoinformationen über das Azure-Portal ab

  1. Suchen Sie in der Azure Search-Leiste nach dem Namen Ihres Batch-Kontos, und wählen Sie ihn aus.
  2. Wählen Sie auf der Seite Ihres Batch-Kontos im linken Navigationsbereich die Option Schlüssel aus.
  3. Kopieren Sie auf der Seite Schlüssel die folgenden Werte:
  • Batch-Konto
  • Kontoendpunkt
  • Primärer Zugriffsschlüssel
  • Speicherkontoname
  • Key1

Bearbeiten Sie in Ihrer heruntergeladenen Python-App die folgenden Zeichenfolgen in der Datei config.py, um die kopierten Werte bereitzustellen.

BATCH_ACCOUNT_NAME = '<batch account>'
BATCH_ACCOUNT_KEY = '<primary access key>'
BATCH_ACCOUNT_URL = '<account endpoint>'
STORAGE_ACCOUNT_NAME = '<storage account name>'
STORAGE_ACCOUNT_KEY = '<key1>'

Wichtig

Das Verfügbarmachen von Kontoschlüsseln in der App-Quelle wird für die Produktionsnutzung nicht empfohlen. Sie sollten den Zugriff auf Anmeldeinformationen einschränken und in Ihrem Code über Variablen oder eine Konfigurationsdatei darauf verweisen. Es empfiehlt sich, Batch- und Storage-Kontoschlüssel in Azure Key Vault zu speichern.

Ausführen der App und Anzeigen der Ausgabe

Führen Sie die App aus, um den Batch-Workflow in Aktion zu erleben.

python python_quickstart_client.py

Die typische Laufzeit beträgt ungefähr drei Minuten. Am meisten Zeit nimmt die anfängliche Einrichtung der Poolknoten ein.

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

Sample start: 11/26/2012 4:02:54 PM

Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [PythonQuickstartPool]...
Creating job [PythonQuickstartJob]...
Adding 3 tasks to job [PythonQuickstartJob]...
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 über die Batch-Kontoseite im Azure-Portal überwachen.

Nach Abschluss der einzelnen Aufgaben wird eine Ausgabe ähnlich dem folgenden Beispiel angezeigt:

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

Überprüfen des Codes

Überprüfen Sie den Code, um die Schritte im Azure Batch-Python-Schnellstart nachzuvollziehen.

Erstellen von Dienstclients und Hochladen von Ressourcendateien

  1. Für die Interaktion mit dem Storage-Konto erstellt die App ein BlobServiceClient-Objekt.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. Die App verwendet den blob_service_client-Verweis, um im Storage-Konto einen Container zu erstellen und Datendateien in den Container hochzuladen. Die Dateien im Speicher werden als Batch-ResourceFile-Objekte definiert, die von Batch später auf Computeknoten heruntergeladen werden können.

    input_file_paths = [os.path.join(sys.path[0], 'taskdata0.txt'),
                        os.path.join(sys.path[0], 'taskdata1.txt'),
                        os.path.join(sys.path[0], 'taskdata2.txt')]
    
    input_files = [
        upload_file_to_container(blob_service_client, input_container_name, file_path)
        for file_path in input_file_paths]
    
  3. Die App erstellt ein BatchServiceClient-Objekt zum Erstellen und Verwalten von Pools, Aufträgen und Aufgaben im Batch-Konto. Für den Batch-Client wird die Authentifizierung mit gemeinsam verwendetem Schlüssel genutzt. Batch unterstützt auch die Microsoft Entra-Authentifizierung.

    credentials = SharedKeyCredentials(config.BATCH_ACCOUNT_NAME,
            config.BATCH_ACCOUNT_KEY)
    
        batch_client = BatchServiceClient(
            credentials,
            batch_url=config.BATCH_ACCOUNT_URL)
    

Erstellen eines Pools mit Computeknoten

Zum Erstellen eines Batch-Pools verwendet die App die PoolAddParameter-Klasse, um die Anzahl von Knoten, die VM-Größe und die Poolkonfiguration festzulegen. Das folgende VirtualMachineConfiguration-Objekt gibt einen ImageReference-Verweis auf ein Ubuntu Server 20.04 LTS-Image im Azure Marketplace an. Batch unterstützt viele verschiedene Linux- und Windows Server-Images im Marketplace sowie benutzerdefinierte VM-Images.

POOL_NODE_COUNT und POOL_VM_SIZE sind definierte Konstanten. Die App erstellt einen Pool mit zwei Knoten der Größe Standard_DS1_v2. Diese Größe bietet für diesen Schnellstart ein gutes Preis-Leistungs-Verhältnis.

Mit der pool.add-Methode wird der Pool an den Batch-Dienst übermittelt.

new_pool = batchmodels.PoolAddParameter(
        id=pool_id,
        virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
            image_reference=batchmodels.ImageReference(
                publisher="canonical",
                offer="0001-com-ubuntu-server-focal",
                sku="20_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 20.04"),
        vm_size=config.POOL_VM_SIZE,
        target_dedicated_nodes=config.POOL_NODE_COUNT
    )
    batch_service_client.pool.add(new_pool)

Erstellen eines Batch-Auftrags

Ein Batch-Auftrag ist eine logische Gruppierung für eine oder mehrere Aufgaben. Der Auftrag enthält gemeinsame Einstellungen für Aufgaben, z. B. die Priorität und den Pool zum Ausführen von Aufgaben.

Die App verwendet die JobAddParameter-Klasse, um im Pool einen Auftrag zu erstellen. Die Methode job.add fügt den Auftrag dem angegebenen Batch-Konto hinzu. Der Auftrag enthält ursprünglich keine Aufgaben.

job = batchmodels.JobAddParameter(
    id=job_id,
    pool_info=batchmodels.PoolInformation(pool_id=pool_id))

batch_service_client.job.add(job)

Erstellen von Aufgaben

In Batch gibt es mehrere Möglichkeiten, Apps und Skripts auf Computeknoten bereitzustellen. Diese App erstellt eine Liste mit Aufgabenobjekten anhand der TaskAddParameter-Klasse. Jede Aufgabe verarbeitet eine Eingabedatei mithilfe eines command_line-Parameters zur Angabe einer App oder eines Skripts.

Das folgende Skript verarbeitet die resource_files-Eingabeobjekte über den Bash-Shellbefehl cat zum Anzeigen der Textdateien. Anschließend verwendet die App die Methode task.add_collection, um dem Auftrag die einzelnen Aufgaben hinzuzufügen und zur Ausführung auf dem Computeknoten in die Warteschlange einzureihen.

tasks = []

for idx, input_file in enumerate(resource_input_files):
    command = f"/bin/bash -c \"cat {input_file.file_path}\""
    tasks.append(batchmodels.TaskAddParameter(
        id=f'Task{idx}',
        command_line=command,
        resource_files=[input_file]
    )
    )

batch_service_client.task.add_collection(job_id, tasks)

Anzeigen der Aufgabenausgabe

Die App überwacht den Aufgabenstatus, um sicherzustellen, dass die Aufgaben abgeschlossen werden. Wenn die Aufgaben erfolgreich ausgeführt werden, wird die Aufgabenbefehlsausgabe in die Datei stdout.txt geschrieben. Die App zeigt dann die Datei stdout.txt für jede abgeschlossene Aufgabe an.

tasks = batch_service_client.task.list(job_id)

for task in tasks:

    node_id = batch_service_client.task.get(job_id, task.id).node_info.node_id
    print(f"Task: {task.id}")
    print(f"Node: {node_id}")

    stream = batch_service_client.file.get_from_task(
        job_id, task.id, config.STANDARD_OUT_FILE_NAME)

    file_text = _read_stream_as_string(
        stream,
        text_encoding)

    if text_encoding is None:
        text_encoding = DEFAULT_ENCODING

    sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = text_encoding)
    sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = text_encoding)

    print("Standard output:")
    print(file_text)

Bereinigen von Ressourcen

Von der App wird der erstellte Speichercontainer automatisch gelöscht, und Sie erhalten die Möglichkeit, den Batch-Pool und -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. Es ist ratsam, den Pool zu löschen, wenn Sie ihn nicht mehr benötigen.

Wenn Sie Ihre Batch-Ressourcen nicht mehr benötigen, können Sie die Ressourcengruppe löschen, in denen sie enthalten sind. Wählen Sie im Azure-Portal oben auf der Ressourcengruppenseite die Option Ressourcengruppe löschen aus. Geben Sie im Bildschirm Ressourcengruppe löschen den Ressourcengruppennamen ein, und wählen Sie dann Löschen aus.

Nächste Schritte

In dieser Schnellstartanleitung haben Sie eine App ausgeführt, die mithilfe der Batch-Python-API einen Batch-Pool, Knoten, einen Auftrag und Aufgaben erstellt. Der Auftrag hat Ressourcendateien in einen Speichercontainer hochgeladen, Aufgaben auf den Knoten ausgeführt und die Ausgabe der Knoten angezeigt.

Da Sie sich jetzt mit den wichtigsten Konzepten des Batch-Diensts vertraut gemacht haben, können Sie Batch mit realistischeren, umfangreicheren Workloads verwenden. Fahren Sie mit dem Batch-Python-Tutorial fort, um weitere Informationen zu Azure Batch sowie eine exemplarische Vorgehensweise für eine parallele Workload mit einer Anwendung aus der Praxis zu erhalten.

Tutorial: Run a parallel workload with Azure Batch using the Python API (Tutorial: Ausführen einer parallelen Workload mit Azure Batch per Python-API)