Quickstart: Python gebruiken om een Batch-pool te maken en een taak uit te voeren

In deze quickstart ziet u hoe u aan de slag gaat met Azure Batch door een app uit te voeren die gebruikmaakt van de Azure Batch-bibliotheken voor Python. De Python-app:

  • Uploadt verschillende invoergegevensbestanden naar een Azure Storage-blobcontainer die moet worden gebruikt voor Batch-taakverwerking.
  • Hiermee maakt u een pool van twee virtuele machines (VM's) of rekenknooppunten waarop het Ubuntu 20.04 LTS-besturingssysteem wordt uitgevoerd.
  • Er wordt een Batch-taak gemaakt, plus drie taken die moeten worden uitgevoerd op de knooppunten. Elke taak verwerkt een van de invoerbestanden met behulp van een Bash-shell-opdrachtregel.
  • Geeft de uitvoerbestanden weer die door de taken worden geretourneerd.

Nadat u deze quickstart hebt voltooid, begrijpt u de belangrijkste concepten van de Batch-service en kunt u Batch gebruiken met realistischere, grotere workloads.

Vereisten

  • Een Azure-account met een actief abonnement. Als u nog geen account hebt, maakt u gratis een account.

  • Een Batch-account met een gekoppeld Azure Storage-account. U kunt de accounts maken met behulp van een van de volgende methoden: Azure CLI Azure Portal | | Bicep ARM-sjabloon | | Terraform.

  • Python versie 3.8 of hoger, waaronder pip Package Manager.

De app uitvoeren

Als u deze quickstart wilt voltooien, downloadt of kloont u de Python-app, geeft u de accountwaarden op, voert u de app uit en controleert u de uitvoer.

De app downloaden of klonen

  1. Download of kloon de Azure Batch Python-quickstart-app vanuit GitHub. Gebruik de volgende opdracht om de app-opslagplaats te klonen met een Git-client:

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. Schakel over naar de map batch-python-quickstart/src en installeer de vereiste pakketten met behulp van pip.

    pip install -r requirements.txt
    

Geef uw accountgegevens op

De Python-app moet de namen van uw Batch- en Storage-account, accountsleutelwaarden en het Eindpunt van het Batch-account gebruiken. U kunt deze informatie ophalen uit Azure Portal, Azure-API's of opdrachtregelprogramma's.

Ga als volgende te werk om uw accountgegevens op te halen uit Azure Portal:

  1. Zoek en selecteer uw Batch-accountnaam in de Azure Search-balk.
  2. Selecteer sleutels in de linkernavigatiebalk op de pagina van uw Batch-account.
  3. Kopieer op de pagina Sleutels de volgende waarden:
  • Batch-account
  • Accounteindpunt
  • Primaire toegangssleutel
  • Naam van opslagaccount
  • Sleutel1

Bewerk in de gedownloade Python-app de volgende tekenreeksen in het config.py-bestand om de waarden op te geven die u hebt gekopieerd.

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

Belangrijk

Het beschikbaar maken van accountsleutels in de app-bron wordt niet aanbevolen voor productiegebruik. U moet de toegang tot referenties beperken en ernaar verwijzen in uw code met behulp van variabelen of een configuratiebestand. Het is raadzaam om batch- en opslagaccountsleutels op te slaan in Azure Key Vault.

De app uitvoeren en uitvoer weergeven

Voer de app uit om de Batch-werkstroom in actie te zien.

python python_quickstart_client.py

De gebruikelijke uitvoeringstijd is ongeveer drie minuten. De eerste installatie van het poolknooppunt duurt het meest.

De app retourneert uitvoer die vergelijkbaar is met het volgende voorbeeld:

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

Er is een pauze op Monitoring all tasks for 'Completed' state, timeout in 00:30:00... het moment dat de rekenknooppunten van de pool beginnen. Wanneer taken worden gemaakt, worden ze in Batch in de wachtrij geplaatst voor uitvoering in de pool. Zodra het eerste rekenknooppunt beschikbaar is, wordt de eerste taak uitgevoerd op het knooppunt. U kunt de status van knooppunten, taken en taken controleren vanaf de pagina van uw Batch-account in Azure Portal.

Nadat elke taak is voltooid, ziet u uitvoer die lijkt op het volgende voorbeeld:

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

De code bekijken

Bekijk de code om inzicht te hebben in de stappen in de Snelstartgids voor Azure Batch Python.

Serviceclients maken en resourcebestanden uploaden

  1. De app maakt een BlobServiceClient-object om te communiceren met het opslagaccount.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. De app gebruikt de blob_service_client verwijzing om een container in het opslagaccount te maken en gegevensbestanden te uploaden naar de container. 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]
    
  3. De app maakt een BatchServiceClient-object voor het maken en beheren van pools, taken en taken in het Batch-account. De Batch-client maakt gebruik van verificatie met gedeelde sleutels. Batch biedt ook ondersteuning voor Microsoft Entra-verificatie.

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

Een pool met rekenknooppunten maken

Voor het maken van een Batch-pool gebruikt de app de klasse PoolAddParameter om het aantal knooppunten, de VM-grootte en de poolconfiguratie in te stellen. Het volgende VirtualMachineConfiguration-object geeft een ImageReference op voor een Ubuntu Server 20.04 LTS Azure Marketplace-installatiekopie. Batch ondersteunt een breed scala aan Linux- en Windows Server Marketplace-installatiekopieën en ondersteunt ook aangepaste VM-installatiekopieën.

De POOL_NODE_COUNT en POOL_VM_SIZE zijn gedefinieerde constanten. De app maakt een pool van twee grootte Standard_DS1_v2 knooppunten. Deze grootte biedt een goede balans tussen prestaties en kosten voor deze quickstart.

Met de methode pool.add 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-job maken

Een Batch-taak is een logische groep met een of meer taken. De taak bevat instellingen die gebruikelijk zijn voor de taken, zoals prioriteit en de pool waarop taken moeten worden uitgevoerd.

De app gebruikt de klasse JobAddParameter om een taak in de pool te maken. Met de methode job.add wordt de 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

Batch biedt verschillende manieren om apps en scripts te implementeren op rekenknooppunten. Met deze app maakt u een lijst met taakobjecten met behulp van de klasse TaskAddParameter . Elke taak verwerkt een invoerbestand met behulp van een command_line parameter om een app of script op te geven.

Met het volgende script worden de invoerobjecten resource_files verwerkt door de Bash-shell-opdracht cat uit te voeren om de tekstbestanden weer te geven. De app gebruikt vervolgens de methode task.add_collection om elke taak toe te voegen aan de taak, waarmee de taken in de wachtrij worden geplaatst voor uitvoering op de rekenknooppunten.

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)

Taakuitvoer weergeven

In de app wordt de taakstatus bijgehouden om te controleren of de taken zijn voltooid. Wanneer elke taak wordt uitgevoerd, schrijft de uitvoer van de taakopdracht naar het stdout.txt-bestand . De app geeft vervolgens het stdout.txt bestand weer voor elke voltooide taak.

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)

Resources opschonen

De gemaakte opslagcontainer wordt automatisch verwijderd met de app en u krijgt de mogelijkheid de Batch-pool en -taak te verwijderen. Pools en knooppunten brengen kosten in rekening terwijl de knooppunten worden uitgevoerd, zelfs als ze geen taken uitvoeren. Als u de pool niet meer nodig hebt, verwijdert u deze.

Wanneer u uw Batch-resources niet meer nodig hebt, kunt u de resourcegroep met deze resources verwijderen. Selecteer in Azure Portal de optie Resourcegroep verwijderen boven aan de pagina van de resourcegroep. Voer in het scherm Een resourcegroep verwijderen de naam van de resourcegroep in en selecteer vervolgens Verwijderen.

Volgende stappen

In deze quickstart hebt u een app uitgevoerd die gebruikmaakt van de Batch Python-API om een Batch-pool, -knooppunten, -taak en -taken te maken. De taak heeft resourcebestanden geüpload naar een opslagcontainer, taken uitgevoerd op de knooppunten en uitvoer van de knooppunten weergegeven.

Nu u de belangrijkste concepten van de Batch-service begrijpt, bent u klaar om Batch te gebruiken met realistischere, grotere workloads. Als u meer wilt weten over Azure Batch en een parallelle workload wilt doorlopen met een echte toepassing, gaat u verder met de zelfstudie over Batch Python.