Snabbstart: Använda Python API för att köra ett Azure Batch jobb

Kom igång med Azure Batch med hjälp av Python-API:et för att köra ett Azure Batch jobb från en app. Appen laddar upp indatafiler till Azure Storage och skapar en pool med Batch-beräkningsnoder (virtuella datorer). Sedan skapas ett jobb som kör aktiviteter för att bearbeta varje indatafil i poolen med hjälp av ett grundläggande kommando.

När du har slutfört den här snabbstarten kommer du att förstå viktiga begrepp för Batch-tjänsten och vara redo att prova Batch med mer realistiska arbetsbelastningar i större skala.

Översikt över arbetsflödet för Azure Batch

Förutsättningar

Logga in på Azure

Logga in på Azure Portal på https://portal.azure.com.

Hämta kontouppgifter

Du måste ange autentiseringsuppgifter för dina Batch- och Storage-konton i det här exemplet. Ett enkelt sätt att hämta de autentiseringsuppgifter som behövs är i Azure-portalen. (Du kan också hämta autentiseringsuppgifterna via Azures API:er och kommandoradsverktyg.)

  1. Välj Alla tjänster>Batch-konton och välj sedan namnet på ditt Batch-konto.

  2. Om du vill se Batch-autentiseringsuppgifterna väljer du Nycklar. Kopiera värdena för Batch-konto, URL och Primär åtkomstnyckel till en textredigerare.

  3. Om du vill se lagringskontots namn och nycklar väljer du Lagringskonto. Kopiera värdena för Lagringskontonamn och Key1 till en textredigerare.

Ladda ned exemplet

Ladda ned eller klona exempelappen från GitHub. Om du vill klona lagringsplatsen för exempelappen med en Git-klient använder du följande kommando:

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

Gå till katalogen som innehåller Python-skriptet python_quickstart_client.py.

I Python-miljön installerar du de nödvändiga paketen med pip.

pip install -r requirements.txt

Öppna filen config.py. Uppdatera autentiseringssträngarna med Batch- och lagringskontouppgifter med värdena för dina konton. Ett exempel:

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

Kör appen

Kör skriptet för att se Batch-arbetsflödet i praktiken:

python python_quickstart_client.py

Granska koden för att lära dig vad varje del av appen gör när skriptet har körts.

När du kör exempelappen ser utdata i konsolen ut ungefär så här. Under körningen uppstår det en paus vid Monitoring all tasks for 'Completed' state, timeout in 00:30:00... medan poolens beräkningsnoder startas. Aktiviteter köas för att köras när den första beräkningsnoden körs. Gå till Batch-kontot i Azure-portalen för att övervaka poolen, beräkningsnoderna, jobbet och aktiviteterna på Batch-kontot.

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

När aktiviteterna har slutförts kan du se utdata som liknar följande för varje aktivitet:

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

Körningen tar normalt runt 3 minuter om du kör programmet med standardkonfigurationen. Den ursprungliga poolinstallationen tar längst tid.

Granska koden

Python-appen i den här snabbstarten gör följande:

  • Överför tre små textfiler till en blobcontainer i ditt Azure-lagringskonto. Dessa filer är indata som ska bearbetas av Batch-aktiviteter.
  • Skapar en pool med två beräkningsnoder som kör Ubuntu 20.04 LTS.
  • Skapar ett jobb och tre aktiviteter som ska köras på noderna. Varje aktivitet bearbetar en av indatafilerna på en kommandorad för Bash-gränssnitt.
  • Visar filer som returneras av aktiviteterna.

Se filen python_quickstart_client.py och information i följande avsnitt.

Förberedelser

För att interagera med ett lagringskonto skapar appen ett BlobServiceClient-objekt .

blob_service_client = BlobServiceClient(
        account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
        credential=config.STORAGE_ACCOUNT_KEY
    )

Appen använder referensen blob_service_client för att skapa en container i lagringskontot och för att överföra filer till containern. De lagrade filerna har definierats som Batch ResourceFile-objekt som Batch senare kan hämta till beräkningsnoder.

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]

Appen skapar ett BatchServiceClient-objekt för att skapa och hantera pooler, jobb och aktiviteter i Batch-tjänsten. Batch-klienten i exemplet använder autentisering med delad nyckel. Batch har även stöd för Azure Active Directory-autentisering.

credentials = SharedKeyCredentials(config.BATCH_ACCOUNT_NAME,
        config.BATCH_ACCOUNT_KEY)

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

Skapa en pool med beräkningsnoder

För att skapa en Batch-pool använder appen klassen PoolAddParameter för att ange antalet noder, VM-storlek och en poolkonfiguration. Här anger ett VirtualMachineConfiguration-objekt en ImageReference till en Ubuntu Server 20.04 LTS-avbildning som publicerats i Azure Marketplace. Batch stöder ett brett utbud av Linux- och Windows Server-avbildningar på Azure Marketplace samt anpassade VM-avbildningar.

Antalet noder (POOL_NODE_COUNT) och VM-storlek (POOL_VM_SIZE) är definierade konstanter. Exemplet skapar som standard en pool med 2 storlekar Standard_DS1_v2 noder. Storleken som föreslås erbjuder en bra balans mellan prestanda och kostnad för det här snabba exemplet.

Metoden pool.add skickar poolen till Batch-tjänsten.

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)

Skapa ett Batch-jobb

Ett Batch-jobb är en logisk gruppering av en eller flera aktiviteter. Ett jobb omfattar inställningar som är gemensamma för aktiviteter, till exempel prioritet och vilken pool som aktiviteterna ska köras på. Appen använder klassen JobAddParameter för att skapa ett jobb på din pool. Metoden job.add lägger till ett jobb i det angivna Batch-kontot. Från början har jobbet inga uppgifter.

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

batch_service_client.job.add(job)

Skapa uppgifter

Appen skapar en lista med aktivitetsobjekt med hjälp av klassen TaskAddParameter. Varje aktivitet bearbetar ett indata resource_files-objekt med en command_line-parameter. I det här exemplet kör kommandoraden Bash-gränssnittskommandot cat för att visa textfilen. Detta kommando är ett enkelt exempel i demonstrationssyfte. När du använder Batch är det på kommandoraden som du anger din app eller ditt skript. Batch tillhandahåller ett antal sätt att distribuera appar och skript till beräkningsnoder.

Sedan lägger appen till aktiviteter i jobbet med metoden task.add_collection som köar dem för att köras på beräkningsnoderna.

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)

Visa aktivitetens utdata

Appen övervakar aktivitetstillståndet för att säkerställa att aktiviteterna slutförs. Sedan visar appen den stdout.txt-fil som skapats av varje slutförd aktivitet. När aktiviteten körs skrivs utdata från aktivitetskommandot till 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(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)

Rensa resurser

Appen tar automatiskt bort den lagringscontainer den skapar och ger dig möjlighet att ta bort Batch-poolen och jobbet. Du debiteras för poolen medan noderna körs, även om inga jobb är schemalagda. Ta bort poolen när du inte längre behöver den. När du tar bort poolen raderas alla aktivitetsutdata på noderna.

När de inte längre behövs tar du bort resursgruppen, Batch-kontot och lagringskontot. Om du vill göra det i Azure Portal väljer du resursgruppen för Batch-kontot och sedan Ta bort resursgrupp.

Nästa steg

I den här snabbstarten körde du en liten app som skapats med Batch Python-API för att skapa en Batch-pool och ett Batch-jobb. Jobbet körde exempelaktiviteter och hämtade utdata som skapats på noderna. Nu när du förstår nyckelbegreppen för Batch-tjänsten är du redo att testa Batch med mer realistiska arbetsbelastningar i större skala. Om du vill lära dig mer om Azure Batch och gå igenom parallell arbetsbelastning med ett verkligt program ska du fortsätta med självstudierna om Batch Python.