Partilhar via


Guia de início rápido: use Python para criar um pool de lotes e executar um trabalho

Este guia de início rápido mostra como começar a usar o Lote do Azure executando um aplicativo que usa as bibliotecas do Lote do Azure para Python. O aplicativo Python:

  • Carrega vários arquivos de dados de entrada em um contêiner de blob de Armazenamento do Azure para usar no processamento de tarefas em lote.
  • Cria um pool de duas máquinas virtuais (VMs), ou nós de computação, executando o Ubuntu 20.04 LTS OS.
  • Cria um trabalho e três tarefas para serem executados nos nós. Cada tarefa processa um dos arquivos de entrada usando uma linha de comando do shell Bash.
  • Exibe os arquivos de saída que as tarefas retornam.

Depois de concluir este início rápido, você entende os principais conceitos do serviço Batch e está pronto para usar o Batch com cargas de trabalho mais realistas e de maior escala.

Pré-requisitos

Executar a aplicação

Para concluir este início rápido, você baixa ou clona o aplicativo Python, fornece os valores da sua conta, executa o aplicativo e verifica a saída.

Baixe ou clone o aplicativo

  1. Transfira ou clone a aplicação Azure Batch Python Quickstart a partir do GitHub. Use o seguinte comando para clonar o repositório de aplicativos com um cliente Git:

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. Alterne para a pasta batch-python-quickstart/src e instale os pacotes necessários usando pip.

    pip install -r requirements.txt
    

Forneça as informações da sua conta

O aplicativo Python precisa usar seus nomes de conta de Lote e Armazenamento, valores de chave de conta e ponto de extremidade de conta de lote. Você pode obter essas informações do portal do Azure, APIs do Azure ou ferramentas de linha de comando.

Para obter as informações da sua conta a partir do portal do Azure:

  1. Na barra de Pesquisa do Azure, procure e selecione o nome da sua conta de lote.
  2. Na página Conta do lote, selecione Teclas na navegação à esquerda.
  3. Na página Chaves, copie os seguintes valores:
  • Conta em lote
  • Ponto final da conta
  • Chave de acesso primária
  • Nome da conta de armazenamento
  • Chave1

Em seu aplicativo Python baixado, edite as seguintes cadeias de caracteres no arquivo config.py para fornecer os valores copiados.

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

Importante

A exposição de chaves de conta na origem do aplicativo não é recomendada para uso em Produção. Você deve restringir o acesso às credenciais e consultá-las em seu código usando variáveis ou um arquivo de configuração. É melhor armazenar chaves de conta de Lote e Armazenamento no Cofre de Chaves do Azure.

Executar o aplicativo e exibir a saída

Execute o aplicativo para ver o fluxo de trabalho em lote em ação.

python python_quickstart_client.py

O tempo de execução típico é de aproximadamente três minutos. A configuração inicial do nó do pool leva mais tempo.

O aplicativo retorna uma saída semelhante ao exemplo a seguir:

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

Há uma pausa enquanto Monitoring all tasks for 'Completed' state, timeout in 00:30:00... os nós de computação do pool são iniciados. À medida que as tarefas são criadas, o Batch as enfileira para serem executadas no pool. Assim que o primeiro nó de computação estiver disponível, a primeira tarefa será executada no nó. Você pode monitorar o status do nó, da tarefa e do trabalho na página da sua conta em lote no portal do Azure.

Após a conclusão de cada tarefa, você verá uma saída semelhante ao exemplo a seguir:

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

Rever o código

Revise o código para entender as etapas no Guia de início rápido do Azure Batch Python.

Criar clientes de serviço e carregar arquivos de recursos

  1. O aplicativo cria um objeto BlobServiceClient para interagir com a conta de armazenamento.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. O aplicativo usa a blob_service_client referência para criar um contêiner na conta de armazenamento e carregar arquivos de dados para o contêiner. Os ficheiros no armazenamento estão definidos como objetos ResourceFile que o Batch pode transferir mais tarde para os nós de computação.

    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. O aplicativo cria um objeto BatchServiceClient para criar e gerenciar pools, trabalhos e tarefas na conta Batch. O cliente Batch usa autenticação de chave compartilhada. O Batch também suporta a autenticação Microsoft Entra.

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

Criar um conjunto de nós de computação

Para criar um pool de lotes, o aplicativo usa a classe PoolAddParameter para definir o número de nós, o tamanho da VM e a configuração do pool. O seguinte objeto VirtualMachineConfiguration especifica um ImageReference para uma imagem do Ubuntu Server 20.04 LTS Azure Marketplace. O Batch suporta uma ampla gama de imagens do Linux e do Windows Server Marketplace e também suporta imagens de VM personalizadas.

As POOL_NODE_COUNT constantes e POOL_VM_SIZE são definidas. O aplicativo cria um pool de dois nós Standard_DS1_v2 tamanho. Este tamanho oferece um bom equilíbrio entre desempenho e custo para este início rápido.

O método pool.add submete o conjunto para o serviço Batch.

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)

Criar uma tarefa do Batch

Uma tarefa do Batch é um agrupamento lógico para uma ou mais tarefas. O trabalho inclui configurações comuns às tarefas, como prioridade e o pool no qual executar tarefas.

O aplicativo usa a classe JobAddParameter para criar um trabalho no pool. O método job.add adiciona o trabalho à conta Batch especificada. Inicialmente, os trabalhos não têm tarefas.

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

batch_service_client.job.add(job)

Criar tarefas

O Batch fornece várias maneiras de implantar aplicativos e scripts em nós de computação. Este aplicativo cria uma lista de objetos de tarefa usando a classe TaskAddParameter . Cada tarefa processa um arquivo de entrada usando um command_line parâmetro para especificar um aplicativo ou script.

O script a seguir processa os objetos de entrada resource_files executando o comando shell cat Bash para exibir os arquivos de texto. Em seguida, o aplicativo usa o método task.add_collection para adicionar cada tarefa ao trabalho, que enfileira as tarefas para serem executadas nos nós de computação.

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)

Ver resultado das tarefas

A aplicação monitoriza o estado da tarefa para se certificar de que as tarefas são concluídas. Quando cada tarefa é executada com êxito, a saída do comando task grava no arquivo stdout.txt . Em seguida, o aplicativo exibe o arquivo stdout.txt para cada tarefa concluída.

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)

Clean up resources (Limpar recursos)

A aplicação elimina automaticamente o contentor de armazenamento criado e oferece-lhe a opção de eliminar o conjunto e o trabalho do Batch. Pools e nós incorrem em cobranças enquanto os nós estão em execução, mesmo que não estejam executando trabalhos. Se você não precisar mais do pool, exclua-o.

Quando não precisar mais dos recursos do Lote, você poderá excluir o grupo de recursos que os contém. No portal do Azure, selecione Excluir grupo de recursos na parte superior da página do grupo de recursos. No ecrã Eliminar um grupo de recursos, introduza o nome do grupo de recursos e, em seguida, selecione Eliminar.

Próximos passos

Neste início rápido, você executou um aplicativo que usa a API Python em lote para criar um pool de lotes, nós, trabalho e tarefas. O trabalho carregou arquivos de recursos em um contêiner de armazenamento, executou tarefas nos nós e exibiu a saída dos nós.

Agora que você entende os principais conceitos do serviço Batch, está pronto para usar o Batch com cargas de trabalho mais realistas e de maior escala. Para saber mais sobre o Azure Batch e percorrer uma carga de trabalho paralela com um aplicativo do mundo real, continue para o tutorial do Batch Python.