Início Rápido: Usar o Python para criar um pool do Lote e executar um trabalho

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

  • Carrega vários arquivos de dados de entrada em um contêiner de blob do Armazenamento do Azure a ser usado para processamento de tarefas do Lote.
  • Cria um pool de duas VMs (máquinas virtuais) ou nós de computação, executando o sistema operacional Ubuntu 20.04 LTS.
  • Cria um trabalho e três tarefas a serem executadas em nós. Cada tarefa processa um dos arquivos de entrada usando uma linha de comando do Shell Bash.
  • Exibe os arquivos de saída retornados pelas tarefas.

Depois de concluir este início rápido, você entenderá os principais conceitos do serviço Lote e estará pronto para experimentá-lo com cargas de trabalho mais realistas em maior escala.

Pré-requisitos

Executar o aplicativo

Para concluir este início rápido, baixe ou clone o aplicativo Python, forneça os valores da sua conta, execute o aplicativo e verifique a saída.

Baixar ou clonar o aplicativo

  1. Baixe ou clone o aplicativo de Início Rápido do Python no Lote do Azure do GitHub. Use o seguinte comando para clonar o repositório do aplicativo 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 do Lote e do Armazenamento, valores de chave de conta e ponto de extremidade da conta do 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 do portal do Azure:

  1. Na barra do Azure Search, pesquise e selecione o nome da conta do Lote.
  2. Na página da Conta do Lote, selecione Chaves na navegação à esquerda.
  3. Na página Chaves, copie os seguintes valores:
  • conta do Lote
  • Ponto de extremidade da conta
  • Chave de acesso primária
  • Nome da conta de armazenamento
  • Key1

No aplicativo Python baixado, edite as seguintes cadeias de caracteres no arquivo config.py para fornecer os valores que você copiou.

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 do Lote e do Armazenamento no Azure Key Vault.

Executar o aplicativo e exibir a saída

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

python python_quickstart_client.py

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

O aplicativo retorna saídas semelhantes ao seguinte exemplo:

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 em Monitoring all tasks for 'Completed' state, timeout in 00:30:00... enquanto os nós de computação do pool são iniciados. À medida que as tarefas são criadas, o Lote 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 status de nó, tarefa e trabalho na página da conta do Lote no portal do Azure.

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

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

Examine o código

Examine o código para entender as etapas no Início Rápido do Python no Lote do Azure.

Criar clientes de serviço e carregar arquivos de recurso

  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 referência blob_service_client para criar um contêiner na Conta de armazenamento e carregar os arquivos de dados no contêiner. Os arquivos no armazenamento são definidos como objetos ResourceFile do Lote que ele pode baixar 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 do Lote. O cliente do Lote no exemplo usa a autenticação de chave compartilhada. O Lote também dá suporte à autenticação do Microsoft Entra.

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

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

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

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

O método pool.add envia o pool para o serviço do Lote.

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 um trabalho do Lote

Um trabalho do Lote é um agrupamento lógico de uma ou mais tarefas. O trabalho inclui configurações comuns às tarefas, como prioridade e o pool onde elas devem ser executadas.

O aplicativo usa a classe JobAddParameter para criar um trabalho no pool. O método job.add adiciona o trabalho à conta do Lote especificada. Inicialmente, o trabalho não tem nenhuma tarefa.

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

batch_service_client.job.add(job)

Criar tarefas

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

O script a seguir processa os objetos de entrada resource_files executando o comando Bash shell cat 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 a 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)

Exibir saída da tarefa

O aplicativo monitora o estado da tarefa para certificar-se de foi concluída. Quando cada tarefa é executada com êxito, a saída do comando de tarefa grava no arquivo stdout.txt. Em seguida, o aplicativo exibe o arquivo destdout.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)

Limpar os recursos

O aplicativo exclui automaticamente o contêiner de armazenamento que cria e oferece a opção para excluir o pool e o trabalho do Lote. Pools e nós incorrem em encargos enquanto os nós estão em execução, mesmo que não estejam executando trabalhos. Se você não precisa mais do pool, exclua-o.

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

Próximas etapas

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

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