Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mithilfe von Azure Batch können Sie umfangreiche auf Parallelverarbeitung ausgelegte HPC-Batchaufträge (High Performance Computing) effizient in Azure ausführen. In diesem Lernprogramm wird ein Python-Beispiel für die Ausführung einer parallelen Workload mithilfe von Batch erläutert. Sie erfahren, wie Sie einen gängigen Batch-Anwendungsworkflow durchführen und programmgesteuert mit Batch- und Storage-Ressourcen interagieren.
- Authentifizieren mit Batch- und Storage-Konten.
- Hochladen von Eingabedateien in Storage.
- Erstellen eines Pools mit Computeknoten für die Ausführung einer Anwendung.
- Erstellen eines Auftrags und von Aufgaben zum Verarbeiten von Eingabedateien.
- Überwachen der Aufgabenausführung
- Abrufen von Ausgabedateien.
In diesem Tutorial konvertieren Sie MP4-Mediendateien parallel in das MP3-Format, indem Sie das Open-Source-Tool ffmpeg verwenden.
Wenn Sie nicht über ein Azure-Konto verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.
Voraussetzungen
Ein Azure Batch-Konto und ein verknüpftes Azure Storage-Konto. Informationen zum Erstellen dieser Konten finden Sie in den Schnellstarthandbüchern für das Azure-Portal oder azure CLI.
Anmelden bei Azure
Melden Sie sich beim Azure-Portal an.
Abrufen der Kontoanmeldeinformationen
In diesem Beispiel müssen Sie Anmeldeinformationen für Ihr Batch- und Ihr Storage-Konto angeben. Die erforderlichen Anmeldeinformationen können Sie ganz einfach über das Azure-Portal abrufen. (Sie können aber auch die Azure-APIs oder Befehlszeilentools verwenden, um die Anmeldeinformationen abzurufen.)
Wählen Sie Alle Dienste>Batch-Konten und anschließend den Namen Ihres Batch-Kontos aus.
Wählen Sie zum Anzeigen der Batch-Anmeldeinformationen Schlüssel aus. Kopieren Sie die Werte für Batch-Konto, URL und Primärer Zugriffsschlüssel in einen Texteditor.
Wählen Sie zum Anzeigen des Namens und der Schlüssel für das Storage-Konto auf Speicherkonto aus. Kopieren Sie die Werte für Speicherkontoname und Schlüssel1 in einen Texteditor.
Herunterladen und Ausführen der Beispiel-App
Herunterladen der Beispiel-App
Laden Sie die Beispiel-App von GitHub herunter, oder klonen Sie sie. Verwenden Sie den folgenden Befehl, um das Beispiel-App-Repository mit einem Git-Client zu klonen:
git clone https://github.com/Azure-Samples/batch-python-ffmpeg-tutorial.git
Navigieren Sie zu dem Verzeichnis, das die Datei batch_python_tutorial_ffmpeg.py enthält.
Installieren Sie in Ihrer Python-Umgebung die erforderlichen Pakete mithilfe von pip.
pip install -r requirements.txt
Verwenden Sie einen Code-Editor, um die Datei config.py zu öffnen. Aktualisieren Sie die Zugangsdaten für Batch- und Speicherkonten mit den für Ihre Konten eindeutigen Werten. Beispiel:
_BATCH_ACCOUNT_NAME = 'yourbatchaccount'
_BATCH_ACCOUNT_KEY = 'xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ=='
_BATCH_ACCOUNT_URL = 'https://yourbatchaccount.yourbatchregion.batch.azure.com'
_STORAGE_ACCOUNT_NAME = 'mystorageaccount'
_STORAGE_ACCOUNT_KEY = 'xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ=='
App starten
So führen Sie das Skript aus
python batch_python_tutorial_ffmpeg.py
Beim Ausführen der Beispielanwendung sieht die Konsolenausgabe in etwa wie folgt aus: Bei der Ausführung kommt es bei Monitoring all tasks for 'Completed' state, timeout in 00:30:00... zu einer Pause, während die Computeknoten des Pools gestartet werden.
Sample start: 11/28/2018 3:20:21 PM
Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [LinuxFFmpegPool]...
Creating job [LinuxFFmpegJob]...
Adding 5 tasks to job [LinuxFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks completed successfully within the specified timeout period.
Deleting container [input]....
Sample end: 11/28/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742
Navigieren Sie im Azure-Portal zu Ihrem Batch-Konto, um den Pool, die Computeknoten, den Auftrag und die Aufgaben zu überwachen. Um beispielsweise eine Wärmekarte der Computeknoten in Ihrem Pool anzuzeigen, wählen Sie Pools>LinuxFFmpegPool aus.
Bei der Ausführung von Aufgaben sieht das Wärmebild in etwa wie folgt aus:
Die typische Ausführungszeit beträgt ungefähr 5 Minuten , wenn Sie die Anwendung in der Standardkonfiguration ausführen. Die meiste Zeit wird für die Poolerstellung benötigt.
Abrufen von Ausgabedateien
Sie können das Azure-Portal verwenden, um die ausgegebenen MP3-Dateien herunterzuladen, die durch die ffmpeg-Aufgaben generiert werden.
- Klicken Sie auf Alle Dienste>Speicherkonten und anschließend auf den Namen Ihres Speicherkontos.
- Klicken Sie auf Blobs>Ausgabe.
- Klicken Sie mit der rechten Maustaste auf eine der ausgegebenen MP3-Dateien, und klicken Sie anschließend auf Herunterladen. Folgen Sie den Anweisungen in Ihrem Browser, um die Datei zu öffnen oder zu speichern.
Die Dateien können auch programmgesteuert aus den Computeknoten oder aus dem Speichercontainer heruntergeladen werden. Dies wird in diesem Beispiel allerdings nicht gezeigt.
Überprüfen des Codes
In den folgenden Abschnitten ist die Beispielanwendung in die Schritte unterteilt, die ausgeführt werden, um eine Workload im Batch-Dienst zu verarbeiten. Beziehen Sie sich auf den Python-Code, während Sie den Rest dieses Artikels lesen, da nicht jede Codezeile im Beispiel besprochen wird.
Authentifizieren des Blobs und der Batch-Clients
Um mit einem Speicherkonto zu interagieren, verwendet die App das Azure-storage-BLOB-Paket , um ein BlockBlobService-Objekt zu erstellen.
blob_client = azureblob.BlockBlobService(
account_name=_STORAGE_ACCOUNT_NAME,
account_key=_STORAGE_ACCOUNT_KEY)
Die App erstellt ein BatchServiceClient-Objekt zum Erstellen und Verwalten von Pools, Aufträgen und Aufgaben im Batchdienst. Der Batchclient im Beispiel verwendet die Authentifizierung gemeinsam genutzter Schlüssel. Batch unterstützt auch die Authentifizierung über die Microsoft Entra-ID, um einzelne Benutzer oder eine unbeaufsichtigte Anwendung zu authentifizieren.
credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME,
_BATCH_ACCOUNT_KEY)
batch_client = batch.BatchServiceClient(
credentials,
base_url=_BATCH_ACCOUNT_URL)
Hochladen von Eingabedateien
Die App verwendet den blob_client Verweis zum Erstellen eines Speichercontainers für die Eingabe-MP4-Dateien und einen Container für die Aufgabenausgabe. Anschließend wird die upload_file_to_container Funktion aufgerufen, um MP4-Dateien im lokalen InputFiles-Verzeichnis 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.
blob_client.create_container(input_container_name, fail_on_exist=False)
blob_client.create_container(output_container_name, fail_on_exist=False)
input_file_paths = []
for folder, subs, files in os.walk(os.path.join(sys.path[0], './InputFiles/')):
for filename in files:
if filename.endswith(".mp4"):
input_file_paths.append(os.path.abspath(
os.path.join(folder, filename)))
# Upload the input files. This is the collection of files that are to be processed by the tasks.
input_files = [
upload_file_to_container(blob_client, input_container_name, file_path)
for file_path in input_file_paths]
Erstellen eines Pools mit Computeknoten
Als Nächstes erstellt das Beispiel im Batch-Konto durch Aufrufen von create_pool einen Pool mit Computeknoten. Diese definierte Funktion verwendet die Batch PoolAddParameter-Klasse , um die Anzahl der Knoten, vm-Größe und eine Poolkonfiguration festzulegen. Hier gibt ein VirtualMachineConfiguration-Objekt ein ImageReference für ein Ubuntu Server 20.04 LTS-Image an, das im Azure Marketplace veröffentlicht wird. Batch unterstützt viele verschiedene VM-Images im Azure Marketplace und auch benutzerdefinierte VM-Images.
Die Anzahl von Knoten und die VM-Größe werden mit definierten Konstanten festgelegt. Batch unterstützt dedizierte Knoten und Spot-Knoten, und Sie können entweder einen oder beide in Ihren Pools verwenden. Dedizierte Knoten sind für Ihren Pool reserviert. Spot-Knoten werden zu einem reduzierten Preis aus überschüssiger VM-Kapazität in Azure angeboten. Spotknoten sind nicht verfügbar, wenn Azure nicht genügend Kapazität aufweist. Im Beispiel wird standardmäßig ein Pool erstellt, der nur fünf Spotknoten in der Größe Standard_A1_v2 enthält.
Zusätzlich zu physischen Knoteneigenschaften enthält diese Poolkonfiguration ein StartTask-Objekt . Der StartTask wird auf jedem Knoten ausgeführt, da dieser Knoten dem Pool beitritt, und jedes Mal, wenn ein Knoten neu gestartet wird. In diesem Beispiel führt der StartTask Bash-Shell-Befehle aus, um das ffmpeg-Paket und die Abhängigkeiten auf den Knoten zu installieren.
Die pool.add-Methode sendet den Pool an den Batchdienst.
new_pool = batch.models.PoolAddParameter(
id=pool_id,
virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
image_reference=batchmodels.ImageReference(
publisher="Canonical",
offer="UbuntuServer",
sku="20.04-LTS",
version="latest"
),
node_agent_sku_id="batch.node.ubuntu 20.04"),
vm_size=_POOL_VM_SIZE,
target_dedicated_nodes=_DEDICATED_POOL_NODE_COUNT,
target_low_priority_nodes=_LOW_PRIORITY_POOL_NODE_COUNT,
start_task=batchmodels.StartTask(
command_line="/bin/bash -c \"apt-get update && apt-get install -y ffmpeg\"",
wait_for_success=True,
user_identity=batchmodels.UserIdentity(
auto_user=batchmodels.AutoUserSpecification(
scope=batchmodels.AutoUserScope.pool,
elevation_level=batchmodels.ElevationLevel.admin)),
)
)
batch_service_client.pool.add(new_pool)
Einen Job erstellen
Für einen Batch-Auftrag werden ein Pool zum Ausführen von Aufgaben und optionale Einstellungen wie eine Priorität und ein Zeitplan für die Arbeitsschritte angegeben. Im Beispiel wird ein Auftrag mit einem Aufruf von create_job erstellt. Bei dieser definierten Funktion wird die JobAddParameter-Klasse verwendet, um einen Auftrag in Ihrem Pool zu erstellen. Die methode job.add sendet den Pool an den Batchdienst. Zunächst hat der Job keine Aufgaben.
job = batch.models.JobAddParameter(
id=job_id,
pool_info=batch.models.PoolInformation(pool_id=pool_id))
batch_service_client.job.add(job)
Aufgaben erstellen
Die App erstellt Aufgaben im Auftrag per Aufruf von add_tasks. Diese definierte Funktion erstellt eine Liste von Aufgabenobjekten mithilfe der TaskAddParameter-Klasse . Jede Aufgabe führt ffmpeg aus, um ein Eingabeobjekt resource_files mithilfe eines command_line Parameters zu verarbeiten. ffmpeg wurde zuvor bei der Erstellung des Pools auf jedem Knoten installiert. Hier wird in der Befehlszeile ffmpeg ausgeführt, um jede MP4-Eingabedatei (Video) in eine MP3-Datei (Audio) zu konvertieren.
Im Beispiel wird nach der Ausführung über die Befehlszeile ein OutputFile-Objekt für die MP3-Datei erstellt. Die Ausgabedateien jeder Aufgabe (in diesem Fall eine) werden mithilfe der Eigenschaft der Aufgabe output_files in einen Container im verknüpften Speicherkonto hochgeladen.
Anschließend werden dem Auftrag von der App mit der task.add_collection-Methode Aufgaben hinzugefügt und für die Ausführung auf den Computeknoten in die Warteschlange eingereiht.
tasks = list()
for idx, input_file in enumerate(input_files):
input_file_path = input_file.file_path
output_file_path = "".join((input_file_path).split('.')[:-1]) + '.mp3'
command = "/bin/bash -c \"ffmpeg -i {} {} \"".format(
input_file_path, output_file_path)
tasks.append(batch.models.TaskAddParameter(
id='Task{}'.format(idx),
command_line=command,
resource_files=[input_file],
output_files=[batchmodels.OutputFile(
file_pattern=output_file_path,
destination=batchmodels.OutputFileDestination(
container=batchmodels.OutputFileBlobContainerDestination(
container_url=output_container_sas_url)),
upload_options=batchmodels.OutputFileUploadOptions(
upload_condition=batchmodels.OutputFileUploadCondition.task_success))]
)
)
batch_service_client.task.add_collection(job_id, tasks)
Aufgaben überwachen
Wenn Aufgaben einem Auftrag hinzugefügt werden, werden sie von Batch automatisch in die Warteschlange eingereiht und für die Ausführung auf Computeknoten im zugeordneten Pool eingeplant. Basierend auf den Einstellungen, die Sie angeben, führt Batch das Einreihen, Planen und erneute Ausführen sowie andere Schritte der Aufgabenverwaltung aus.
Es gibt viele Ansätze zur Überwachung der Aufgabenausführung. Die wait_for_tasks_to_complete Funktion in diesem Beispiel verwendet das TaskState-Objekt , um Aufgaben für einen bestimmten Zustand zu überwachen, in diesem Fall der abgeschlossene Zustand innerhalb eines Zeitlimits.
while datetime.datetime.now() < timeout_expiration:
print('.', end='')
sys.stdout.flush()
tasks = batch_service_client.task.list(job_id)
incomplete_tasks = [task for task in tasks if
task.state != batchmodels.TaskState.completed]
if not incomplete_tasks:
print()
return True
else:
time.sleep(1)
...
Bereinigen von Ressourcen
Nach dem Ausführen der Aufgaben löscht die App den erstellten Eingabespeichercontainer automatisch und ermöglicht Ihnen das Löschen des Batch-Pools und -Auftrags. Die JobOperations - und PoolOperations-Klassen von BatchClient weisen beide Löschmethoden auf, die aufgerufen werden, wenn Sie den Löschvorgang bestätigen. Für die Aufträge und Aufgaben fallen zwar keine Kosten an, für Computeknoten dagegen schon. Daher empfehlen wir Ihnen, Pools nur bei Bedarf zuzuordnen. Beim Löschen des Pools werden alle Aufgabenausgaben auf den Knoten gelöscht. Die Eingabe- und Ausgabedateien verbleiben jedoch im Speicherkonto.
Löschen Sie die Ressourcengruppe, das Batch-Konto und das Speicherkonto, wenn diese Elemente nicht mehr benötigt werden. Wählen Sie dazu im Azure-Portal die Ressourcengruppe für das Batchkonto aus, und wählen Sie " Ressourcengruppe löschen" aus.
Nächste Schritte
In diesem Tutorial haben Sie Folgendes gelernt:
- Authentifizieren mit Batch- und Storage-Konten.
- Hochladen von Eingabedateien in Storage.
- Erstellen eines Pools mit Computeknoten für die Ausführung einer Anwendung.
- Erstellen eines Auftrags und von Aufgaben zum Verarbeiten von Eingabedateien.
- Überwachen der Aufgabenausführung
- Abrufen von Ausgabedateien.
Weitere Beispiele für die Verwendung der Python-API zum Planen und Verarbeiten von Batchworkloads finden Sie in den Batch Python-Beispielen auf GitHub.