Kom igång med Batch SDK för JavaScript

Lär dig grunderna i att skapa en Batch-klient i JavaScript med hjälp av Azure Batch JavaScript SDK. Vi tar en stegvis metod för att förstå ett scenario för ett batchprogram och sedan konfigurera det med JavaScript.

Förutsättningar

Den här artikeln förutsätter att du har en fungerande kunskap om JavaScript och kunskaper om Linux. Den förutsätter också att du har ett Azure-konto med behörighet att skapa batch- och lagringstjänster.

Vi rekommenderar att du läser Azure Batch, teknisk översikt innan du går igenom stegen som beskrivs i den här artikeln.

Förstå scenariot

Här har vi ett enkelt skript skrivet i Python som laddar ned alla csv-filer från en Azure Blob Storage-container och konverterar dem till JSON. Om du vill bearbeta flera Storage- kontocontainrar parallellt med varandra kan vi distribuera skriptet som ett Azure Batch-jobb.

Azure Batch arkitektur

Följande diagram visar hur vi kan skala Python-skriptet med hjälp av Azure Batch och en klient.

Diagram som visar scenarioarkitektur.

JavaScript-exemplet distribuerar ett batchjobb med en förberedelseaktivitet (förklaras i detalj senare) och en uppsättning aktiviteter beroende på antalet containrar i lagringskontot. Du kan ladda ned skripten från GitHub-lagringsplatsen.

Tips

JavaScript-exemplet i den angivna länken innehåller inte specifik kod som ska distribueras som en Azure-funktionsapp. Se följande länkar för att få anvisningar om hur du skapar en sådan.

Skapa programmet

Nu ska vi följa processen steg för steg för att skapa JavaScript-klienten:

Steg 1: Installera Azure Batch SDK

Du kan installera Azure Batch SDK för JavaScript med hjälp av kommandot npm install.

npm install @azure/batch

Det här kommandot installerar den senaste versionen av Azure-batch JavaScript SDK.

Tips

Om du använder en Azure-funktionsapp går du till Kudu-konsolen på Azure-funktionens inställningsflik för att köra installationskommandot npm. I det här fallet installerar du Azure Batch SDK för JavaScript.

Steg 2: Skapa ett Azure Batch-konto

Du kan skapa den från Azure Portal eller från kommandoraden (PowerShell /Azure CLI).

Nedan beskrivs kommandon som kan användas för att skapa ett sådant med hjälp av Azure CLI.

Skapa en resursgrupp. Hoppa över det här steget om du redan har en på den plats där du vill skapa ett Batch-konto:

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

Skapa ett Azure Batch-konto.

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

Varje Batch-konto har motsvarande åtkomstnycklar. Dessa nycklar behövs för att skapa fler resurser i Azure Batch-kontot. Om du arbetar med en produktionsmiljö är det en bra idé att lagra nycklarna i Azure Key Vault. Du kan sedan skapa ett huvudnamn för tjänsten för programmet. Med den här tjänstens huvudnamn kan programmet skapa en OAuth-token för att komma åt åtkomstnycklarna i Key Vault.

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

Kopiera och lagra nyckeln som ska användas i efterföljande steg.

Steg 3: Skapa en Azure Batch-tjänsteklient

Följande kodfragment importerar först JavaScript-modulen azure-batch och skapar sedan en Batch Service-klient. Du måste först skapa ett SharedKeyCredentials-objekt med hjälp av den nyckel för Batch-kontot som kopierades i det föregående steget.

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

URI:en för Azure Batch återfinns på översiktsfliken i Azure Portal. Formatet ser ut så här:

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

Se skärmbilden:

URI för Azure Batch

Steg 4: Skapa en Azure Batch-pool

En Azure Batch-pool består av flera virtuella datorer (även kallade batchnoder). Azure Batch-tjänsten distribuerar aktiviteterna på noderna och hanterar dem. Följande konfigurationsparametrar kan definieras för din pool.

  • Typ av virtuell datoravbildning
  • Storlek på de virtuella datornoderna
  • Antal virtuella datornoder

Tips

Storlekar och antalet virtuella noder beror huvudsakligen på antalet aktiviteter som du vill köra parallellt samt själva uppgiften som ska utföras. Vi rekommenderar tester för att bäst kunna avgöra det bästa antalet och perfekta storlekar.

Följande kodfragment skapar konfigurationsparameterobjekten.

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

Tips

En lista över virtuella datoravbildningar med Linux och deras SKU ID:n finns i Lista över virtuella datoravbildningar.

När poolkonfigurationen har definierats kan du skapa Azure Batch-poolen. Batch-poolkommandot skapar virtuella Azure-datornoder och förbereder dem för att kunna ta emot och köra aktiviteter. I alla efterföljande steg ska det finnas ett unikt referens-ID.

Använd följande kodfragment för att skapa en Azure Batch-pool.

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

Kontrollera status för den pool som har skapats och försäkra dig om att den är i ”aktivt” tillstånd innan du går vidare med att skicka jobb till poolen i fråga.

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

Följande är ett exempel på ett resultatobjekt som returnerats av funktionen 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' }}

Steg 4: Skicka ett Azure Batch-jobb

Azure Batch-jobbet består av en logisk grupp av snarlika uppgifter. I vårt scenario är det "Process csv to JSON". Varje uppgift här kan bearbeta csv-filer som finns i varje Azure Storage-container.

Dessa uppgifter körs parallellt och distribueras över flera noder, och allt detta samordnas av Azure Batch-tjänsten.

Tips

Du kan använda egenskapen taskSlotsPerNode för att ange maximalt antal aktiviteter som kan köras samtidigt på en enda nod.

Förberedande aktivitet

De VM-noder som skapas är tomma Ubuntu-noder. Oftast måste du installera en obligatorisk uppsättning program. Om du använder Linux-noder har du normalt sett ett kommandoskript som installerar alla obligatoriska program innan de faktiska aktiviteterna körs. Det kan röra sig om vilka körbara filer som helst.

Shell-skriptet i det här exemplet installerar Python-pip och Azure Storage Blob SDK för Python.

Du kan ladda upp skriptet på Azure Storage-kontot och generera en SAS-URI för att komma åt skriptet. Den här processen kan också automatiseras med Hjälp av Azure Storage JavaScript SDK.

Tips

Förberedande aktiviteter för ett jobb kan endast köras på de virtuella datornoder där en viss aktivitet ska köras. Om du vill att de obligatoriska programmen ska installeras på alla noder, oavsett vilka aktiviteter som körs på dem, kan du använda egenskapen startTask när du lägger till poolen. Du kan använda följande definition för förberedande aktiviteter som referens.

En förberedande aktivitet anges vid överföring av Azure Batch-jobbet. Här följer några konfigurerbara förberedelseaktivitetsparametrar:

  • ID: En unik identifierare för den förberedande aktiviteten
  • commandLine: Den kommandorad som exekverar den körbara filen
  • resourceFiles: En uppsättning objekt som tillhandahåller detaljerad information om de filer som måste laddas ned innan aktiviteten kan köras. Här visas alternativen
    • httpUrl: URL:en för filen som ska laddas ned
    • filePath: Lokal sökväg för nedladdning och sparande av filen.
    • fileMode: fileMode har ett oktalt format med standardvärdet 0770 (gäller endast Linux-noder).
  • waitForSuccess: Om värdet är satt till sant går det inte att köra aktiviteten om den förberedande aktiviteten misslyckas.
  • runElevated: Sätt värdet till sant om det krävs utökad behörighet för att få köra uppgiften.

Följande kodfragment innehåller ett exempel på skriptkonfigurering för den förberedande aktiviteten:

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

Om det inte finns några obligatoriska program att installera före aktivitetskörningen kan du hoppa över de förberedande aktiviteterna. Följande kod skapar ett jobb med visningsnamnet ”process csv files” (bearbeta CSV-filer).

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

Steg 5: Skicka Azure Batch-aktiviteter för ett jobb

Nu när vi har skapat ett jobb för bearbetning av CSV-filer kan vi börja skapa aktiviteter för jobbet i fråga. Anta att vi har fyra containrar och vill skapa fyra aktiviteter – en för varje container.

Om vi tittar på Python-skriptet så godtas två möjliga parametrar:

  • container name: Den Storage-behållare som du vill ladda ned filer från
  • pattern: En valfri parameter för filnamnsmönster

Förutsatt att vi har fyra containrar "con1", "con2", "con3","con4" visas följande kod som skickar fyra aktiviteter till Azure Batch-jobbet "process csv" som vi skapade tidigare.

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

Koden lägger till flera aktiviteter i poolen. Varje aktivitet körs på en nod i poolen med virtuella datorer. Om antalet aktiviteter överskrider antalet virtuella datorer i en pool eller egenskapen taskSlotsPerNode väntar aktiviteterna tills en nod görs tillgänglig. Denna orkestrering hanteras automatiskt av Azure Batch.

Portalen har detaljerade vyer för aktiviteter och jobbstatusar. Du kan också använda listan och hämta funktioner i Azure JavaScript SDK. Detaljerad information kan fås via dokumentationslänken.

Nästa steg