Quickstart: De Python-API gebruiken om een Azure Batch-job uit te voeren

Ga aan de slag met Azure Batch door de Python-API te gebruiken om een Azure Batch-taak uit een app uit te voeren. Met de app worden invoergegevensbestanden geüpload naar Azure Storage en wordt vervolgens een pool met Batch-rekenknooppunten (virtuele machines) gemaakt. Vervolgens wordt er een job gemaakt waarmee taken worden uitgevoerd om elk invoerbestand in de pool te verwerken met behulp van een basisopdracht.

Nadat u deze quickstart hebt voltooid, begrijpt u de belangrijkste principes van de Azure Batch-service en bent u er klaar voor om Azure Batch op grotere schaal te gebruiken voor meer realistische workloads.

Overzicht van de Azure Batch-werkstroom

Vereisten

Aanmelden bij Azure

Meld u aan bij de Azure Portal op https://portal.azure.com.

Accountreferenties ophalen

In dit voorbeeld moet u referenties opgeven voor uw Batch- en Storage-accounts. U kunt de referenties eenvoudig ophalen in Azure Portal. (U kunt deze referenties ook ophalen met de Azure-API's of de opdrachtregelprogramma's.)

  1. Selecteer Alle services > Batch-accounts en selecteer vervolgens de naam van uw Batch-account.

  2. Selecteer Sleutels om de Batch-referenties te zien. Kopieer de waarden van Batch-account, URL en Primaire toegangssleutel in een teksteditor.

  3. Selecteer Opslagaccount als u de naam en sleutels van het opslagaccount wilt zien. Kopieer de waarden van Naam van opslagaccount en Key1 in een teksteditor.

Het voorbeeld downloaden

Download of kloon de voorbeeld-app vanuit GitHub. Als u de opslagplaats van de voorbeeld-app wilt klonen met een Git-client, gebruikt u de volgende opdracht:

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

Ga naar de map met het Python-script python_quickstart_client.py.

Installeer de vereiste pakketten in de Python-ontwikkelomgeving met behulp van pip.

pip install -r requirements.txt

Open het bestand config.py. Werk de referentietekenreeksen van het Batch- en Storage-account bij met de waarden die u hebt gekregen voor de accounts. Bijvoorbeeld:

_BATCH_ACCOUNT_NAME = 'mybatchaccount'
_BATCH_ACCOUNT_KEY = 'xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ=='
_BATCH_ACCOUNT_URL = 'https://mybatchaccount.mybatchregion.batch.azure.com'
_STORAGE_ACCOUNT_NAME = 'mystorageaccount'
_STORAGE_ACCOUNT_KEY = 'xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ=='

De app uitvoeren

Als u de werking van de Batch-werkstroom wilt zien, voert u het volgende script uit:

python python_quickstart_client.py

Nadat het script is uitgevoerd, bekijkt u de code voor meer informatie over wat elk onderdeel van de toepassing doet.

Wanneer u de voorbeeldtoepassing uitvoert, ziet de uitvoer van de console er ongeveer als volgt uit. De actieve uitvoering wordt bij Monitoring all tasks for 'Completed' state, timeout in 00:30:00... onderbroken terwijl de rekenknooppunten van de pool worden gestart. Taken worden in de wachtrij geplaatst om te worden uitgevoerd zodra het eerste rekenknooppunt actief is. Ga naar uw Batch-account in Azure Portal om de pool, rekenknooppunten en taken in het Batch-account te controleren.

Sample start: 11/26/2018 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...

Nadat taken zijn voltooid, ziet u uitvoer voor elke taak die er ongeveer als volgt uitziet:

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 in business, engineering, science, and other pursuits that require running lots of automated tasks....
...

Wanneer u de toepassing uitvoert in de standaardconfiguratie, bedraagt de uitvoeringstijd doorgaans ongeveer 3 minuten. De eerste keer dat u de pool instelt, neemt dit de meeste tijd in beslag.

De code bekijken

Met de Python-app in deze snelstartgids worden de volgende bewerkingen uitgevoerd:

  • Er worden drie kleine tekstbestanden geüpload naar een blobcontainer in het Azure-opslagaccount. Deze bestanden bevatten invoergegevens voor verwerking met Batch-taken.
  • Hiermee maakt u een pool van twee rekenknooppunten met Ubuntu 20.04 LTS.
  • Er wordt een Batch-taak gemaakt, plus drie taken die moeten worden uitgevoerd op de knooppunten. Met elke taak wordt een van de invoerbestanden verwerkt met behulp van een Bash-shell-opdrachtregel.
  • Er worden bestanden weergegeven die zijn geretourneerd met de taken.

Bekijk het bestand python_quickstart_client.py en de volgende secties voor de details.

Voorbereidingen

Voor interactie met een opslagaccount maakt de app een BlobServiceClient-object.

blob_service_client = BlobServiceClient(
        account_url="https://{}.{}/".format(
            config._STORAGE_ACCOUNT_NAME,
            config._STORAGE_ACCOUNT_DOMAIN
        ),
        credential=config._STORAGE_ACCOUNT_KEY
    )

De app gebruikt de blob_service_client-verwijzing om een container te maken in het opslagaccount en om gegevensbestanden naar de container te uploaden. De bestanden in de opslag zijn gedefinieerd als Batch ResourceFile-objecten die later met Batch kunnen worden gedownload op rekenknooppunten.

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]

De app maakt een BatchServiceClient-object om pools, Batch-taken en taken in de Batch-service te maken en te beheren. De Batch-client in het voorbeeld gebruikt verificatie op basis van gedeelde sleutels. Batch ondersteunt ook Azure Active Directory-verificatie.

credentials = SharedKeyCredentials(config._BATCH_ACCOUNT_NAME,
        config._BATCH_ACCOUNT_KEY)

    batch_client = BatchServiceClient(
        credentials,
        batch_url=config._BATCH_ACCOUNT_URL)

Een pool van rekenknooppunten maken

Voor het maken van een Batch-pool gebruikt de app de PoolAddParameter-klasse om het aantal rekenknooppunten, de VM-grootte en een poolconfiguratie in te stellen. Hier geeft een VirtualMachineConfiguration-object een ImageReference op naar een Ubuntu Server 20.04 LTS-installatie afbeelding die is gepubliceerd in de Azure Marketplace. Batch ondersteunt diverse Linux- en Windows Server-installatiekopieën in Azure Marketplace, evenals aangepaste VM-installatiekopieën.

Het aantal knooppunten (_POOL_NODE_COUNT) en de VM-grootte (_POOL_VM_SIZE) zijn gedefinieerde constanten. In het voorbeeld wordt standaard een pool van 2 groottes Standard_DS1_v2 knooppunten. De voorgestelde grootte in dit snelle voorbeeld biedt een goede balans tussen prestaties en kosten.

Met de pool.add-methode wordt de pool naar de Batch-service verzonden.

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)

Een Batch-taak maken

Een Batch-taak is een logische groep met een of meer taken. Een Batch-taak omvat instellingen die gemeenschappelijk zijn voor de taken, zoals prioriteit en de pool waarop taken moeten worden uitgevoerd. De app gebruikt de JobAddParameter-klasse om een taak te maken in de pool. Met de methode job.add wordt een taak toegevoegd aan het opgegeven Batch-account. De Batch-taak heeft in eerste instantie geen taken.

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

batch_service_client.job.add(job)

Taken maken

De app gebruikt de TaskAddParameter-klasse om een lijst met taakobjecten te maken. Met elke taak wordt een resource_files-invoerobject verwerkt met behulp van een command_line-parameter. In het voorbeeld wordt met de opdrachtregel de opdracht cat voor de Bash-shell uitgevoerd om het tekstbestand weer te geven. Deze opdracht is een eenvoudig voorbeeld voor demonstratiedoeleinden. Wanneer u Batch gebruikt, geeft u uw app of script op de opdrachtregel op. Batch biedt een aantal manieren om apps en scripts te implementeren op rekenknooppunten.

Vervolgens worden met de app taken toegevoegd aan de Batch-taak met behulp van de task.add_collection-methode. Deze methode plaatst de taken in een wachtrij voor uitvoering op de rekenknooppunten.

tasks = list()

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

Taakuitvoer weergeven

In de app wordt de taakstatus bijgehouden om te controleren of de taken zijn voltooid. Vervolgens ziet u in de app het stdout.txt-bestand dat na elke voltooide taak wordt gegenereerd. Wanneer de taak is voltooid, wordt de uitvoer van de taakopdracht geschreven naar stdout.txt:

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("Task: {}".format(task.id))
    print("Node: {}".format(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,
        encoding)
    print("Standard output:")
    print(file_text)

Resources opschonen

De gemaakte opslagcontainer wordt automatisch verwijderd met de app en u krijgt de mogelijkheid de Batch-pool en -taak te verwijderen. Er worden kosten berekend voor de pool zolang de knooppunten actief zijn, zelfs als er geen taken zijn gepland. Verwijder de pool wanneer u deze niet meer nodig hebt. Wanneer u de pool verwijdert, wordt ook alle taakuitvoer op de knooppunten verwijderd.

Verwijder de resourcegroep, het Batch-account en het opslagaccount wanneer u deze niet meer nodig hebt. Hiervoor selecteert u in Azure Portal de resourcegroep voor het Batch-account en selecteert u Resourcegroep verwijderen.

Volgende stappen

In deze snelstartgids hebt u een kleine app gebouwd met behulp van de Batch Python API om een Batch-pool en een Batch-taak te maken. Met de taak zijn voorbeeldtaken uitgevoerd, en u hebt de uitvoer van de knooppunten gedownload. Nu u de belangrijkste principes van de Batch-service begrijpt, bent u er klaar voor om Batch op grotere schaal te gebruiken voor meer realistische workloads. Ga verder met de Batch Python-zelfstudie voor meer informatie over Azure Batch en een stapsgewijze uitleg over een parallelle workload met een toepassing uit de praktijk.