Compartilhar via


Introdução ao SDK Batch para JavaScript

Conheça as noções básicas de criar um cliente Batch em JavaScript usando Azure Batch JavaScript SDK. Executamos uma abordagem passo a passo para entender um cenário para um aplicativo em lote e, em seguida, configurá-lo usando JavaScript.

Pré-requisitos

Este artigo pressupõe que você tenha um conhecimento funcional do JavaScript e familiaridade com o Linux. Ele também pressupõe que você tenha uma conta configurada no Azure com permissões de acesso para criar serviços de Batch e Armazenamento.

É recomendável ler Azure Batch Visão geral técnica antes de percorrer as etapas descritas neste artigo.

Compreender o cenário

Aqui, temos um script simples escrito em Python que baixa todos os arquivos csv de um contêiner de armazenamento de blobs Azure e os converte em JSON. Para processar vários contêineres de conta de armazenamento em paralelo, podemos implantar o script como um trabalho de Azure Batch.

arquitetura de Azure Batch

O diagrama a seguir descreve como podemos dimensionar o script Python usando Azure Batch e um cliente.

Diagrama mostrando a arquitetura do cenário.

O exemplo javaScript implanta um trabalho em lote com uma tarefa de preparação (explicada em detalhes posteriormente) e um conjunto de tarefas, dependendo do número de contêineres na conta de armazenamento. Você pode baixar os scripts do repositório GitHub.

Dica

O exemplo de JavaScript no link especificado não contém código específico a ser implantado como um aplicativo de funções Azure. Você pode consultar os links a seguir para obter instruções para criar um.

Criar o aplicativo

Agora, vamos seguir o processo passo a passo para criar o cliente JavaScript:

Etapa 1: Instalar Azure Batch SDK

Você pode instalar Azure Batch SDK para JavaScript usando o comando de instalação do npm.

npm install @azure/batch

Esse comando instala a versão mais recente do Azure Batch SDK JavaScript.

Dica

Em um aplicativo Azure Function, você pode acessar "Console do Kudu" na guia Configurações da função Azure para executar os comandos de instalação do npm. Nesse caso, instale Azure Batch SDK para JavaScript.

Etapa 2: Criar uma conta de Azure Batch

Você pode criá-lo no portal Azure ou na linha de comando (PowerShell /Azure CLI).

A seguir estão os comandos para criar um por Azure CLI.

Crie um Grupo de Recursos, ignore esta etapa se você já tiver uma em que deseja criar a Conta do Lote:

az group create -n "<resource-group-name>" -l "<location>"

Em seguida, crie uma conta Azure Batch.

az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"

Cada conta do Batch tem suas chaves de acesso correspondentes. Essas chaves são necessárias para criar mais recursos na conta de Batch do Azure. Uma boa prática para o ambiente de produção é usar Azure Key Vault para armazenar essas chaves. Em seguida, você pode criar um principal de serviço para o aplicativo. Usando esse princípio de serviço, o aplicativo pode criar um token OAuth para acessar chaves do cofre de chaves (key vault).

az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"

Copie e armazene a chave a ser usada nas etapas subsequentes.

Etapa 3: Criar um cliente de serviço Azure Batch

O trecho de código a seguir primeiro importa o módulo azure-batch JavaScript e, em seguida, cria um cliente do serviço Batch. Primeiro, você precisa criar um objeto SharedKeyCredentials com a chave da conta do Batch copiada da etapa anterior.

// Initializing Azure Batch variables

import { BatchServiceClient, BatchSharedKeyCredentials } from "@azure/batch";

// Replace values below with Batch Account details
const batchAccountName = '<batch-account-name>';
const batchAccountKey = '<batch-account-key>';
const batchEndpoint = '<batch-account-url>';

const credentials = new BatchSharedKeyCredentials(batchAccountName, batchAccountKey);
const batchClient = new BatchServiceClient(credentials, batchEndpoint);

O URI do Azure Batch pode ser encontrado na guia Visão geral do portal de Azure. Ele é do formato:

https://accountname.location.batch.azure.com

Consulte a captura de tela:

URI de lote do Azure

Etapa 4: Criar um pool de Azure Batch

Um pool do Azure Batch consiste em várias VMs (também conhecidas como Nodes de Batch). O serviço Azure Batch implanta as tarefas nesses nós e as gerencia. Você pode definir os seguintes parâmetros de configuração para o pool.

  • Tipo de imagem da Máquina Virtual
  • Tamanho dos nós da Máquina Virtual
  • Número de nós da Máquina Virtual

Dica

O tamanho e o número de nós da Máquina Virtual dependem em grande parte do número de tarefas que você deseja executar em paralelo e também da própria tarefa. É recomendável testar para determinar o número e o tamanho ideais.

O snippet de código a seguir cria os objetos de parâmetro de configuração.

// Creating Image reference configuration for Ubuntu Linux VM
const imgRef = {
    publisher: "Canonical",
    offer: "UbuntuServer",
    sku: "20.04-LTS",
    version: "latest"
}
// Creating the VM configuration object with the SKUID
const vmConfig = {
    imageReference: imgRef,
    nodeAgentSKUId: "batch.node.ubuntu 20.04"
};
// Number of VMs to create in a pool
const numVms = 4;

// Setting the VM size
const vmSize = "STANDARD_D1_V2";

Dica

Para obter a lista de imagens de VM do Linux disponíveis para Azure Batch e suas IDs de SKU, consulte Lista de imagens de máquina virtual.

Depois que a configuração do pool for definida, você poderá criar o pool de Azure Batch. O comando de pool do Batch cria nós de Máquina Virtual do Azure e os prepara para estarem prontos para receber tarefas a serem executadas. Cada pool deve ter uma ID exclusiva para referência nas etapas subsequentes.

O snippet de código a seguir cria um pool de Azure Batch.

// Create a unique Azure Batch pool ID
const now = new Date();
const poolId = `processcsv_${now.getFullYear()}${now.getMonth()}${now.getDay()}${now.getHours()}${now.getSeconds()}`;

const poolConfig = {
    id: poolId,
    displayName: "Processing csv files",
    vmSize: vmSize,
    virtualMachineConfiguration: vmConfig,
    targetDedicatedNodes: numVms,
    enableAutoScale: false
};

// Creating the Pool
var pool = batchClient.pool.add(poolConfig, function (error, result){
    if(error!=null){console.log(error.response)};
});

Você pode verificar o status do pool criado e garantir o estado seja "ativo" antes de prosseguir com o envio de um trabalho ao pool.

var cloudPool = batchClient.pool.get(poolId,function(error,result,request,response){
        if(error == null)
        {

            if(result.state == "active")
            {
                console.log("Pool is active");
            }
        }
        else
        {
            if(error.statusCode==404)
            {
                console.log("Pool not found yet returned 404...");

            }
            else
            {
                console.log("Error occurred while retrieving pool data");
            }
        }
        });

Veja a seguir um objeto de resultado de exemplo retornado pela função pool.get.

{
  id: 'processcsv_2022002321',
  displayName: 'Processing csv files',
  url: 'https://<batch-account-name>.westus.batch.azure.com/pools/processcsv_2022002321',
  eTag: '0x8D9D4088BC56FA1',
  lastModified: 2022-01-10T07:12:21.943Z,
  creationTime: 2022-01-10T07:12:21.943Z,
  state: 'active',
  stateTransitionTime: 2022-01-10T07:12:21.943Z,
  allocationState: 'steady',
  allocationStateTransitionTime: 2022-01-10T07:13:35.103Z,
  vmSize: 'standard_d1_v2',
  virtualMachineConfiguration: {
    imageReference: {
      publisher: 'Canonical',
      offer: 'UbuntuServer',
      sku: '20.04-LTS',
      version: 'latest'
    },
    nodeAgentSKUId: 'batch.node.ubuntu 20.04'
  },
  resizeTimeout: 'PT15M',
  currentDedicatedNodes: 4,
  currentLowPriorityNodes: 0,
  targetDedicatedNodes: 4,
  targetLowPriorityNodes: 0,
  enableAutoScale: false,
  enableInterNodeCommunication: false,
  taskSlotsPerNode: 1,
  taskSchedulingPolicy: { nodeFillType: 'Spread' }}

Etapa 4: Enviar uma tarefa Azure Batch

Um processo Azure Batch é um grupo lógico de tarefas semelhantes. Em nosso cenário, é "Process csv to JSON". Cada tarefa aqui pode estar processando arquivos csv presentes em cada contêiner Azure Storage.

Essas tarefas seriam executadas em paralelo e implantadas em vários nós, orquestradas pelo serviço Azure Batch.

Dica

Você pode usar a propriedade taskSlotsPerNode para especificar o número máximo de tarefas que podem ser executadas simultaneamente em um único nó.

Tarefa de preparação

Os nós da VM criados são nós em branco do Ubuntu. Muitas vezes, você precisa instalar um conjunto de programas como pré-requisitos. Normalmente, para nodos Linux, você pode ter um script de shell que instala os pré-requisitos antes que as tarefas em si sejam executadas. No entanto, pode ser qualquer executável programável.

O script shell neste exemplo instala o Python-pip e o SDK do Blob Azure Storage para Python.

Você pode carregar o script em uma conta Azure Storage e gerar um URI sas para acessar o script. Esse processo também pode ser automatizado usando o SDK do JavaScript Azure Storage.

Dica

Uma tarefa de preparação para um trabalho é executada somente nos nós da VM em que a tarefa específica precisa ser executada. Se você quiser que os pré-requisitos sejam instalados em todos os nós, independentemente das tarefas executadas nele, use a propriedade startTask ao adicionar um pool. Você pode usar a seguinte definição de tarefa de preparação para referência.

Uma tarefa de preparação é especificada durante a submissão de um trabalho do Azure Batch. A seguir estão alguns parâmetros de tarefa de preparação configurável:

  • ID: um identificador exclusivo para a tarefa de preparação
  • commandLine: linha de comando para executar o executável da tarefa
  • resourceFiles: matriz de objetos que fornecem detalhes dos arquivos necessários para serem baixados para que essa tarefa seja executada. A seguir estão suas opções
    • httpUrl: a URL do arquivo a ser baixado
    • filePath: caminho local para baixar e salvar o arquivo
    • fileMode: aplicável somente para nós de Linux, o fileMode está em formato octal com um valor padrão de 0770
  • waitForSuccess: se definido como true, a tarefa não é executada no caso de falhas de tarefa de preparação
  • runElevated: defina-o como true se forem necessários privilégios elevados para executar a tarefa.

O snippet de código a seguir mostra o exemplo de configuração de script de tarefa de preparação:

var jobPrepTaskConfig = {id:"installprereq",commandLine:"sudo sh startup_prereq.sh > startup.log",resourceFiles: [{ 'httpUrl': 'Blob sh url', 'filePath': 'startup_prereq.sh' }],waitForSuccess:true,runElevated:true, userIdentity: {autoUser: {elevationLevel: "admin", scope: "pool"}}}

Se não houver pré-requisitos a serem instalados para que suas tarefas sejam executadas, você poderá ignorar as tarefas de preparação. O código a seguir cria um trabalho com o nome de exibição "processar arquivos csv".

// Setting Batch Pool ID
const poolInfo = { poolId: poolId };
// Batch job configuration object
const jobId = "processcsvjob";
const jobConfig = {
    id: jobId,
    displayName: "process csv files",
    jobPreparationTask: jobPrepTaskConfig,
    poolInfo: poolInfo
};
// Adding Azure batch job to the pool
const job = batchClient.job.add(jobConfig, function (error, result) {
        if (error !== null) {
            console.log("An error occurred while creating the job...");
            console.log(error.response);
        }
    }
);

Etapa 5: Enviar as tarefas do "Azure Batch" para um trabalho

Agora que nosso processo de trabalho csv foi criado, vamos criar tarefas para esse processo. Supondo que tenhamos quatro contêineres, precisamos criar quatro tarefas, uma para cada contêiner.

Se examinarmos o script Python, ele aceitará dois parâmetros:

  • nome do contêiner: o contêiner de armazenamento do qual baixar arquivos
  • padrão: um parâmetro opcional do padrão de nome de arquivo

Supondo que tenhamos quatro contêineres "con1", "con2", "con3", "con4", o código mostrado a seguir demonstra como enviar quatro tarefas ao trabalho em lote do Microsoft Azure 'processamento de CSV' que foi criado previamente.

// storing container names in an array
const containerList = ["con1", "con2", "con3", "con4"];      //Replace with list of blob containers within storage account
containerList.forEach(function (val, index) {
    console.log("Submitting task for container : " + val);
    const containerName = val;
    const taskID = containerName + "_process";
    // Task configuration object
    const taskConfig = {
        id: taskID,
        displayName: 'process csv in ' + containerName,
        commandLine: 'python processcsv.py --container ' + containerName,
        resourceFiles: [{ 'httpUrl': 'Blob script url', 'filePath': 'processcsv.py' }]
    };

    const task = batchClient.task.add(jobId, taskConfig, function (error, result) {
        if (error !== null) {
            console.log("Error occurred while creating task for container " + containerName + ". Details : " + error.response);
        }
        else {
            console.log("Task for container : " + containerName + " submitted successfully");
        }
    });
});

O código adiciona várias tarefas ao pool. E cada uma das tarefas é executada em um nó no pool de VMs criadas. Se o número de tarefas exceder o número de VMs em um pool ou na propriedade taskSlotsPerNode, as tarefas aguardarão até que um nó seja disponibilizado. Essa orquestração é manipulada por Azure Batch automaticamente.

O portal tem exibições detalhadas sobre as tarefas e os status das atividades. Você também pode usar a lista e obter funções no SDK Azure JavaScript. Os detalhes são fornecidos no link da documentação.

Próximas etapas