Delen via


Aan de slag met Batch SDK voor JavaScript

Leer de basisbeginselen van het bouwen van een Batch-client in JavaScript met behulp van Azure Batch JavaScript SDK. We gebruiken een stapsgewijze benadering om een scenario voor een batchtoepassing te begrijpen en dit vervolgens in te stellen met behulp van JavaScript.

Vereisten

In dit artikel wordt ervan uitgegaan dat u praktische kennis hebt van JavaScript 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.

Het wordt aangeraden om Technisch overzicht van Azure Batch door te nemen voordat u de stappen uit dit artikel doorloopt.

Inzicht in het scenario

Dit is een eenvoudig script geschreven in Python waarmee alle CSV-bestanden uit een Azure Blob Storage-container worden gedownload en waarmee ze naar JSON worden geconverteerd. Als u meerdere oplagaccountcontainers tegelijk wilt verwerken, kunt u het script als een Azure Batch-taak implementeren.

Azure Batch-architectuur

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

Diagram waarin de architectuur van het scenario wordt weergegeven.

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

Tip

Het JavaScript-voorbeeld in de opgegeven koppeling bevat geen specifieke code die moet worden geïmplementeerd als een Azure-functie-app. U kunt de volgende koppelingen bekijken voor informatie over het maken van een Azure-functie-app.

De toepassing bouwen

Laten we nu stapsgewijs het proces voor het bouwen van de JavaScript-client volgen:

Stap 1: De Azure Batch-SDK installeren

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

npm install @azure/batch

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

Tip

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

Stap 2: Een Azure Batch-account maken

U kunt het maken via Azure Portal of vanaf de opdrachtregel (PowerShell /Azure-CLI).

Nu volgende opdrachten om er een te maken via Azure CLI.

Maak een resourcegroep. Sla deze stap over als u er al een hebt waarin u het Batch-account wil maken:

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

Maak daarna een Azure Batch-account.

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

Elk Batch-account heeft bijbehorende toegangssleutels. Deze sleutels zijn nodig om aanvullende resources te maken in het Azure Batch-account. Het is voor productieomgevingen een goed idee om Azure Key Vault te gebruiken om deze sleutels op te slaan. Vervolgens maakt u een service-principal voor de toepassing. Met deze service-principal kan de toepassing een OAuth-token maken voor toegangssleutels uit Key Vault.

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

Kopieer en bewaar de benodigde sleutel voor gebruik 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 in 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);

U kunt de Azure Batch-URI vinden op het tabblad Overzicht van Azure Portal. Deze heeft de volgende indeling:

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

Zie de schermafbeelding:

Azure Batch-URI

Stap 4: Een Azure Batch-pool maken

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

  • Type VM-installatiekopie
  • Grootte van de VM-knooppunten
  • Aantal VM-knooppunten

Tip

De grootte van en het aantal VM-knooppunten hangt in grote mate af van het aantal taken dat u tegelijk wilt uitvoeren en de taak zelf. Het wordt aangeraden om tests uit te voeren om het ideale aantal en de ideale grootte te bepalen.

Met het volgende codefragment worden de objecten voor de configuratieparameters 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";

Tip

Zie de lijst met VM-installatiekopieën voor een overzicht van welke virtuele Linux-machines er beschikbaar zijn voor Azure Batch en welke SKU-id's deze hebben.

Wanneer de poolconfiguratie is gedefinieerd, kunt u de Azure Batch-pool maken. Met de Batch-poolopdracht maakt u Azure VM-knooppunten en bereidt u deze voor op het ontvangen van taken om uit te voeren. Elke pool moet een unieke id krijgen zodat er in volgende stappen naar kan worden verwezen.

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 bekijken om te controleren of de status Actief is. Doe dit voordat u een taak opgeeft voor 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 staat een voorbeeldresultaatobject dat is 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 dit 'CSV verwerken naar JSON'. Elke taak hier kan CSV-bestanden verwerken die aanwezig zijn in elke Azure Storage-container.

Deze taken worden gelijktijdig uitgevoerd en op verschillende knooppunten geïmplementeerd, of ingedeeld door de Azure Batch-service.

Tip

U kunt de eigenschap taskSlotsPerNode gebruiken om aan te geven hoeveel taken maximaal tegelijk mogen worden uitgevoerd op één knooppunt.

Voorbereidingstaak

De VM-knooppunten die worden gemaakt, zijn lege Ubuntu-knooppunten. U moet als vereiste vaak een reeks programma's installeren. Normaal gesproken is er voor Linux-knooppunten een Shell-script waarmee de vereiste onderdelen worden geïnstalleerd voordat de eigenlijke taken worden uitgevoerd. Dit kunnen echter alle programmeerbare uitvoerbare bestanden 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 naar een Azure Storage-account en een SAS-URI genereren om toegang tot het script te verkrijgen. Dit proces kan ook worden geautomatiseerd met behulp van de Azure Storage JavaScript SDK.

Tip

Er wordt alleen een voorbereidingstaak voor een taak uitgevoerd op de VM-knooppunten waarop de specifieke taak moet worden uitgevoerd. Als u wilt dat de vereiste onderdelen 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. Ter referentie kunt u de volgende voorbereidingstaakdefinitie gebruiken.

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

  • Id: De unieke id van de voorbereidingstaak
  • commandLine: De opdrachtregel voor het uitvoeren van het uitvoerbare bestand voor de taak
  • resourceFiles: Matrix met objecten die informatie bieden over welke bestanden moeten worden gedownload om deze taak te kunnen uitvoeren. Hieronder vindt u de bijbehorende opties
    • httpUrl: de URL van het bestand dat moet worden gedownload
    • filePath: Het lokale pad voor het downloaden en opslaan van het bestand
    • fileMode: fileMode is alleen van toepassing op Linux-knooppunten en heeft een octale indeling met de standaardwaarde 0770
  • waitForSuccess: Als deze optie is ingesteld op True, wordt de taak niet uitgevoerd voor mislukte voorbereidingstaken
  • runElevated: U moet deze optie instellen op True als er verhoogde bevoegdheden nodig zijn om de taak uit te voeren.

Met het volgende codefragment wordt het configuratievoorbeeld weergegeven van het script van de voorbereidingstaak:

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 vereiste onderdelen hoeven te worden geïnstalleerd voor het uitvoeren van uw taken, kunt u de voorbereidingstaken overslaan. Met de volgende code wordt een taan aangemaakt met de weergavenaam 'process csv files'.

// 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 taak voor het verwerken van CSV-bestanden is gemaakt, maakt u taken voor die taak. Als u vier containers hebt, maakt u vier taken, één voor elke container.

In het Python-script ziet u dat er twee parameters worden geaccepteerd:

  • containernaam: De opslagcontainer waaruit de bestanden worden gedownload
  • patroon: Een optionele parameter voor een bestandsnaampatroon

Ervan uitgaande dat we vier containers 'con1', 'con2', 'con3', 'con4' hebben, toont de volgende code het verzenden van vier taken naar de Azure-batchtaak 'proces-CSV' die we eerder hebben gemaakt.

// 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. Alle taken worden uitgevoerd op een knooppunt in de pool gemaakte VM's. Als het aantal taken het aantal VM's in een pool overschrijdt, of als de eigenschap taskSlotsPerNode wordt overschreven, wordt er gewacht tot een aanvullend knooppunt beschikbaar is gemaakt. Azure Batch deelt alles automatisch in.

De portal biedt een gedetailleerd overzicht van de taken en de taakstatus. U kunt ook de lijst gebruiken en functies ophalen in de Azure JavaScript SDK. U vindt meer informatie in de documentatie (koppeling).

Volgende stappen