Partilhar via


Introdução ao Batch SDK for JavaScript

Aprenda as noções básicas da criação de um cliente Batch em JavaScript usando o SDK do Azure Batch JavaScript. Adotamos 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 prático de JavaScript e familiaridade com Linux. Assume-se também que o utilizador tem uma conta Azure configurada com direitos de acesso para criar serviços Batch e de Armazenamento.

Recomendamos a leitura da Visão Geral Técnica do Azure Batch antes de seguir 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 Blob do Azure e os converte em JSON. Para processar vários contentores de contas de armazenamento em paralelo, podemos executar o script como um trabalho do Azure Batch.

Arquitetura do Azure Batch

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

Diagrama mostrando a arquitetura do cenário.

O exemplo de JavaScript implanta um trabalho em lote com uma tarefa de preparação (explicada em detalhes mais tarde) 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.

Sugestão

O exemplo de JavaScript no link especificado não contém código específico a ser implantado como um aplicativo de função do 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 construir o cliente JavaScript:

Etapa 1: Instalar o Azure Batch SDK

Você pode instalar o SDK do Lote do Azure para JavaScript usando o comando npm install.

npm install @azure/batch

Este comando instala a versão mais recente do azure-batch JavaScript SDK.

Sugestão

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

Etapa 2: Criar uma conta do Azure Batch

Você pode criá-lo a partir do portal do Azure ou da linha de comando (PowerShell /Azure CLI).

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

Crie um Grupo de Recursos, ignore esta etapa se já tiver um onde deseja criar a Conta em lote:

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

Em seguida, crie uma conta do Azure Batch.

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

Cada conta Batch tem suas chaves de acesso correspondentes. Essas chaves são necessárias para criar mais recursos na conta em lote do Azure. Uma boa prática para o ambiente de produção é usar o Azure Key Vault para armazenar essas chaves. Em seguida, pode-se criar um Service principal para a aplicação. Usando essa entidade de serviço, o aplicativo pode criar um token OAuth para acessar chaves do cofre de chaves.

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 do Azure Batch

O trecho de código a seguir primeiro importa o módulo JavaScript azure-batch e, em seguida, cria um cliente do Batch Service. Você precisa primeiro criar um objeto SharedKeyCredentials com a chave de conta 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 URL do Azure Batch pode ser encontrado na guia Visão Geral do portal do Azure. É do formato:

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

Consulte a captura de tela:

Uri de lote do Azure

Etapa 4: Criar um pool de Batch do Azure

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

  • Tipo de imagem da máquina virtual
  • Tamanho dos nós da máquina virtual
  • Número de nós de máquina virtual

Sugestão

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. Recomendamos testes para determinar o número e o tamanho ideais.

O trecho 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";

Sugestão

Para obter a lista de imagens de VM do Linux disponíveis para o Lote do Azure 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 Lotes do Azure. O comando Pool de lotes 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 um ID exclusivo para referência nas etapas subsequentes.

O seguinte trecho de código cria um pool de Batch do Azure.

// 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 estado do pool criado e assegurar-se de que o estado seja "ativo" antes de prosseguir com o envio de um trabalho para esse 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");
            }
        }
        });

A seguir está 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 um trabalho do Azure Batch

Um trabalho no Azure Batch é um grupo lógico de tarefas semelhantes. No nosso cenário, é "Processar CSV para JSON". Cada tarefa aqui pode estar processando arquivos CSV presentes em cada contentor de Armazenamento do Azure.

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

Sugestão

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 de VM criados são nós Ubuntu vazios. Muitas vezes, você precisa instalar um conjunto de programas como pré-requisitos. Normalmente, para nós Linux você pode ter um shell script que instala os pré-requisitos antes que as tarefas reais sejam executadas. No entanto, pode ser qualquer executável programável.

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

Você pode carregar o script em uma Conta de Armazenamento do Azure e gerar um URI SAS para acessar o script. Esse processo também pode ser automatizado usando o SDK JavaScript do Armazenamento do Azure.

Sugestão

Uma tarefa de preparação para um trabalho é executada somente nos nós da VM onde a tarefa específica precisa ser executada. Se desejar que os pré-requisitos sejam instalados em todos os nós, independentemente das tarefas que são executadas nele, você pode usar 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 o envio de um trabalho em lote do Azure. A seguir estão alguns parâmetros configuráveis da tarefa de preparação:

  • 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 que precisam ser baixados para que esta tarefa seja executada. Seguem-se as suas opções
    • httpUrl: O URL do arquivo para baixar
    • filePath: Caminho local para baixar e salvar o arquivo
    • fileMode: Aplicável apenas para nós Linux, fileMode está em formato octal com um valor predefinido de 0770
  • waitForSuccess: Se definido como true, a tarefa não é executada em caso de falhas na tarefa de preparação
  • runElevated: defina-o como true se forem necessários privilégios elevados para executar a tarefa.

O trecho 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: Submeter tarefas Batch do Azure para um trabalho

Agora que a nossa tarefa de processo CSV está criada, vamos criar tarefas para essa tarefa. Supondo que temos quatro contêineres, temos que criar quatro tarefas, uma para cada contêiner.

Se olharmos para o script Python, ele aceita dois parâmetros:

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

Supondo que temos quatro contêineres "con1", "con2", "con3","con4" o código a seguir mostra o envio de quatro tarefas para o trabalho em lote do Azure "process csv" que criamos anteriormente.

// 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 num pool ou a propriedade taskSlotsPerNode, as tarefas esperarão até que um nó esteja disponível. Essa orquestração é tratada automaticamente pelo Azure Batch.

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

Próximos passos