Delen via


Aan de slag met Batch SDK voor JavaScript

Meer informatie over de basisbeginselen van het bouwen van een Batch-client in JavaScript met behulp van de Azure Batch JavaScript SDK. We nemen een stapsgewijze benadering van het begrijpen van een scenario voor een batchtoepassing en vervolgens instellen met behulp van JavaScript.

Vereiste voorwaarden

In dit artikel wordt ervan uitgegaan dat u een werkende kennis van JavaScript hebt en bekend bent met Linux. Er wordt ook van uitgegaan dat u een Azure-account hebt ingesteld met toegangsrechten voor het maken van Batch- en Storage-services.

We raden u aan het technische overzicht van Azure Batch te lezen voordat u de stappen doorloopt die in dit artikel worden beschreven.

Inzicht in het scenario

Hier hebben we een eenvoudig script geschreven in Python waarmee alle CSV-bestanden uit een Azure Blob Storage-container worden gedownload en geconverteerd naar JSON. Als u meerdere opslagaccountcontainers parallel wilt verwerken, kunnen we het script implementeren als een Azure Batch-taak.

Azure Batch-architectuur

In het volgende diagram ziet u hoe u het Python-script kunt schalen met behulp van Azure Batch en een client.

Diagram met scenarioarchitectuur.

In het JavaScript-voorbeeld wordt een batchtaak geïmplementeerd met een voorbereidingstaak (uitgebreid uitgelegd) en een reeks taken, afhankelijk van het aantal containers in het opslagaccount. U kunt de scripts downloaden uit de GitHub-opslagplaats.

Hint

Het JavaScript-voorbeeld in de opgegeven koppeling bevat geen specifieke code die moet worden geïmplementeerd als een Azure-functie-app. Raadpleeg de volgende koppelingen voor instructies om er een te maken.

De toepassing bouwen

Laten we nu stap voor stap het proces volgen om de JavaScript-client te bouwen:

Stap 1: Azure Batch SDK installeren

U kunt Azure Batch SDK voor JavaScript installeren met behulp van de npm-installatieopdracht.

npm install @azure/batch

Met deze opdracht wordt de nieuwste versie van azure-batch JavaScript SDK geïnstalleerd.

Hint

In een Azure Function-app kunt u naar Kudu Console gaan op het tabblad Instellingen van de Azure-functie om de npm-installatieopdrachten uit te voeren. In dit geval moet u Azure Batch SDK voor JavaScript installeren.

Stap 2: Een Azure Batch-account maken

U kunt deze maken vanuit Azure Portal of vanaf de opdrachtregel (PowerShell /Azure CLI).

Hieronder volgen de opdrachten om er een te maken via Azure CLI.

Maak een resourcegroep en sla deze stap over als u er al een hebt waar u het Batch-account wilt maken:

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

Maak vervolgens een Azure Batch-account.

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

Elk Batch-account heeft de bijbehorende toegangssleutels. Deze sleutels zijn nodig om meer resources te maken in een Azure Batch-account. Een goede gewoonte voor een productieomgeving is het gebruik van Azure Key Vault om deze sleutels op te slaan. Vervolgens kunt u een service-principal voor de toepassing maken. Met deze service-principal kan de toepassing een OAuth-token maken voor toegang tot sleutels vanuit de sleutelkluis.

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

Kopieer en sla de sleutel op die moet worden gebruikt in de volgende stappen.

Stap 3: Een Azure Batch-serviceclient maken

Met het volgende codefragment importeert u eerst de Azure-batch JavaScript-module en maakt u vervolgens een Batch Service-client. U moet eerst een SharedKeyCredentials-object maken met de Batch-accountsleutel die u uit de vorige stap hebt gekopieerd.

// 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);

De Azure Batch-URI vindt u op het tabblad Overzicht van Azure Portal. Het is van de volgende indeling:

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

Raadpleeg de schermopname:

Azure Batch-URI

Stap 4: Een Azure Batch-pool maken

Een Azure Batch-pool bestaat uit meerdere VM's (ook wel Batch-knooppunten genoemd). De Azure Batch-service implementeert de taken op deze knooppunten en beheert deze. U kunt de volgende configuratieparameters voor uw pool definiëren.

  • Type virtuele machine-afbeelding
  • Grootte van virtuele-machineknooppunten
  • Aantal virtuele-machineknooppunten

Hint

De grootte en het aantal virtuele-machineknooppunten zijn grotendeels afhankelijk van het aantal taken dat u parallel wilt uitvoeren en ook de taak zelf. We raden u aan om te testen om het ideale getal en de ideale grootte te bepalen.

Met het volgende codefragment worden de configuratieparameterobjecten gemaakt.

// 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";

Hint

Zie Lijst met installatiekopieën van virtuele Linux-machines die beschikbaar zijn voor Azure Batch en de bijbehorende SKU-id's.

Zodra de poolconfiguratie is gedefinieerd, kunt u de Azure Batch-pool maken. Met de opdracht Batch-pool worden Azure Virtual Machine-knooppunten gemaakt en voorbereid om ze gereed te maken voor het ontvangen van taken die moeten worden uitgevoerd. Elke pool moet een unieke id hebben voor referentie in de volgende stappen.

Met het volgende codefragment wordt een Azure Batch-pool gemaakt.

// 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)};
});

U kunt de status van de gemaakte pool controleren en ervoor zorgen dat de status actief is voordat u doorgaat met het verzenden van een taak naar die 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");
            }
        }
        });

Hieronder volgt een voorbeeldresultaatobject dat wordt geretourneerd door de functie 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' }}

Stap 4: Een Azure Batch-taak verzenden

Een Azure Batch-taak is een logische groep vergelijkbare taken. In ons scenario is het 'Csv-bestand verwerken naar JSON'. Elke taak hier kan CSV-bestanden verwerken die aanwezig zijn in elke Azure Storage-container.

Deze taken worden parallel uitgevoerd en geïmplementeerd op meerdere knooppunten, ingedeeld door de Azure Batch-service.

Hint

U kunt de eigenschap taskSlotsPerNode gebruiken om het maximum aantal taken op te geven dat gelijktijdig op één knooppunt kan worden uitgevoerd.

Voorbereidingstaak

De aangemaakte VM-knooppunten zijn lege Ubuntu-knooppunten. Vaak moet u een set programma's installeren als voorvereiste. Normaal gesproken kunt u voor Linux-knooppunten een shellscript hebben waarmee de vereisten worden geïnstalleerd voordat de werkelijke taken worden uitgevoerd. Het kan echter elk programmeerbaar uitvoerbaar bestand zijn.

Met het shell-script in dit voorbeeld worden Python-pip en de Azure Storage Blob SDK voor Python geïnstalleerd.

U kunt het script uploaden in een Azure Storage-account en een SAS-URI genereren voor toegang tot het script. Dit proces kan ook worden geautomatiseerd met behulp van de Azure Storage JavaScript SDK.

Hint

Een voorbereidingstaak voor een taak wordt alleen uitgevoerd op de VM-knooppunten waarop de specifieke taak moet worden uitgevoerd. Als u wilt dat vereisten op alle knooppunten worden geïnstalleerd, ongeacht de taken die erop worden uitgevoerd, kunt u de eigenschap startTask gebruiken tijdens het toevoegen van een pool. U kunt de volgende voorbereidingstaakdefinitie gebruiken ter referentie.

Er wordt een voorbereidingstaak opgegeven tijdens het verzenden van de Azure Batch-taak. Hier volgen enkele configureerbare parameters voor de voorbereidingstaak:

  • Id: Een unieke id voor de voorbereidingstaak
  • commandLine: opdrachtregel voor het uitvoeren van het uitvoerbare taakbestand
  • resourceFiles: matrix met objecten die details bevatten van bestanden die moeten worden gedownload om deze taak uit te voeren. Hieronder volgen de opties
    • httpUrl: de URL van het bestand dat u wilt downloaden
    • filePath: lokaal pad om het bestand te downloaden en op te slaan
    • fileMode: Alleen van toepassing op Linux-knooppunten, fileMode heeft een octale indeling met een standaardwaarde van 0770
  • waitForSuccess: Als deze is ingesteld op true, wordt de taak niet uitgevoerd bij mislukte voorbereidingstaken
  • runElevated: stel deze in op true als verhoogde bevoegdheden nodig zijn om de taak uit te voeren.

Het volgende codefragment toont het configuratievoorbeeld van het voorbereidingstaakscript:

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"}}}

Als er geen vereisten zijn om uw taken uit te voeren, kunt u de voorbereidingstaken overslaan. Met de volgende code wordt een taak gemaakt met de weergavenaam 'CSV-bestanden verwerken'.

// 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);
        }
    }
);

Stap 5: Azure Batch-taken voor een taak verzenden

Nu de CSV-taak voor het proces is gemaakt, gaan we taken voor die taak maken. Ervan uitgaande dat we vier containers hebben, moeten we vier taken maken, één voor elke container.

Als we het Python-script bekijken, accepteert het twee parameters:

  • containernaam: de Opslagcontainer waaruit u bestanden wilt downloaden
  • patroon: Een optionele parameter van bestandsnaampatroon

Ervan uitgaande dat we vier containers 'con1', 'con2', 'con3', 'con4' hebben, worden met de volgende code vier taken verzonden naar de Azure Batch-taak 'CSV verwerken' die we eerder hebben aangemaakt.

// 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");
        }
    });
});

Met de code worden meerdere taken aan de pool toegevoegd. En elk van de taken wordt uitgevoerd op een knooppunt in de pool met virtuele machines die zijn gemaakt. Als het aantal taken groter is dan het aantal VM's in een pool of de eigenschap taskSlotsPerNode, wachten de taken totdat een knooppunt beschikbaar wordt gesteld. Deze indeling wordt automatisch verwerkt door Azure Batch.

De portal bevat gedetailleerde weergaven over de taken en taakstatussen. U kunt de lijst ook gebruiken en functies ophalen in de Azure JavaScript SDK. Details vindt u in de documentatie link.

Volgende stappen