Freigeben über


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

In dieser Schnellstartanleitung erfahren Sie, wie Sie mit Azure Batch beginnen, indem Sie eine App ausführen, die die Azure Batch-Bibliotheken für Python verwendet. Die Python-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 mit Ubuntu 22.04 LTS OS.
  • Es werden ein Auftrag und drei Aufgaben für die Ausführung auf den Knoten erstellt. Jede Aufgabe verarbeitet eine der Eingabedateien mithilfe einer Bash-Shell-Befehlszeile.
  • 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 Python-App herunter oder klonen 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 Azure Batch Python-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-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
    

Geben Sie Ihre Kontoinformationen an

Die Python-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.
  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:
  • Batchkonto
  • Kontoendpunkt
  • Primärer Zugriffsschlüssel
  • Speicherkontoname
  • Key1

Bearbeiten Sie in Ihrer heruntergeladenen Python-App die folgenden Zeichenfolgen in der config.py-Datei , um die werte zu liefern, die Sie kopiert haben.

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

Von Bedeutung

Das Verfügbarmachen von Kontoschlüsseln in der App-Quelle wird für die Produktionsverwendung nicht empfohlen. Sie sollten den Zugriff auf Anmeldeinformationen einschränken und in Ihrem Code mithilfe von Variablen oder einer Konfigurationsdatei darauf verweisen. Es ist am besten, Batch- und Speicherkontoschlüssel in Azure Key Vault zu speichern.

Führen Sie die App aus und betrachten Sie die Ausgabe

Führen Sie die App aus, um den Batchworkflow in Aktion anzuzeigen.

python python_quickstart_client.py

Die typische Laufzeit beträgt ungefähr drei Minuten. Die Einrichtung des initialen Poolknotens nimmt am meisten Zeit in Anspruch.

Die App gibt eine Ausgabe zurück, die dem folgenden Beispiel ähnlich ist:

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 auf Der Seite "Batchkonto" im Azure-Portal überwachen.

Nachdem jeder Vorgang abgeschlossen ist, wird eine Ausgabe angezeigt, die dem folgenden Beispiel ähnelt:

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 in der Schnellstartanleitung von Azure Batch Python zu verstehen.

Erstellen von Dienstclients und Hochladen von Ressourcendateien

  1. Die App erstellt ein BlobServiceClient-Objekt für die Interaktion mit dem Speicherkonto.

    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 einen Container im Speicherkonto 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 Batchkonto. Der Batchclient verwendet die gemeinsame Schlüsselauthentifizierung. 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 Batchpools verwendet die App die PoolAddParameter-Klasse , um die Anzahl von Knoten, VM-Größe und Poolkonfiguration festzulegen. Das folgende VirtualMachineConfiguration -Objekt gibt ein ImageReference für ein Ubuntu Server 22.04 LTS Azure Marketplace-Image an. Batch unterstützt eine vielzahl von Linux- und Windows Server Marketplace-Images und unterstützt auch benutzerdefinierte VM-Images.

Die 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 ein gutes Verhältnis von Leistung zu Kosten für diesen Schnellstart.

Die pool.add-Methode sendet den Pool an den Batchdienst.

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="22_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 22.04"),
        vm_size=config.POOL_VM_SIZE,
        target_dedicated_nodes=config.POOL_NODE_COUNT
    )
    batch_service_client.pool.add(new_pool)

Erstellen eines Batchauftrags

Ein Batchauftrag ist eine logische Gruppierung einer oder mehrerer 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 Batchkonto hinzu. Zunächst hat der Job keine Aufgaben.

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

batch_service_client.job.add(job)

Aufgaben erstellen

In Batch gibt es mehrere Möglichkeiten, Apps und Skripts auf Computeknoten bereitzustellen. Diese App erstellt eine Liste von Aufgabenobjekten mithilfe der TaskAddParameter-Klasse . Jede Aufgabe verarbeitet eine Eingabedatei mithilfe eines command_line Parameters, um eine App oder ein Skript anzugeben.

Das folgende Skript verarbeitet die Eingabeobjekte resource_files , indem der Bash-Shellbefehl cat ausgeführt wird, um die Textdateien anzuzeigen. Die App verwendet dann die task.add_collection-Methode, um jede Aufgabe dem Auftrag hinzuzufügen, wodurch die Aufgaben zur Ausführung auf den Rechenknoten in die Warteschlange gestellt werden.

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 sind. Wenn jede Aufgabe erfolgreich ausgeführt wird, schreibt der Aufgabenbefehl in die Datei stdout.txt. Die App zeigt dann die stdout.txt Datei 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

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 Ihre Batchressourcen 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-Python-API verwendet, um einen Batchpool, Knoten, Auftrag und Aufgaben zu erstellen. 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. Um mehr über Azure Batch zu erfahren und eine parallele Workload mit einer realen Anwendung zu durchlaufen, fahren Sie mit dem Batch Python-Lernprogramm fort.