Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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. Det förutsätter också att du har en Azure-kontokonfiguration med åtkomstbehörighet för att skapa Batch- och Storage-tjänster.
Vi rekommenderar att du läser Azure Batch Technical Overview 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 lagringskontocontainrar parallellt 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.
              
              
            
JavaScript-exemplet distribuerar ett batchjobb med en förberedelseaktivitet (förklaras i detalj senare) och en uppsättning uppgifter beroende på antalet containrar i lagringskontot. Du kan ladda ned skripten från GitHub-lagringsplatsen.
Tips/Råd
JavaScript-exemplet i den angivna länken innehåller inte specifik kod som ska distribueras som en Azure-funktionsapp. Du kan se följande länkar för instruktioner för att skapa en.
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 installationskommandot npm.
npm install @azure/batch
Det här kommandot installerar den senaste versionen av Azure-batch JavaScript SDK.
Tips/Råd
I en Azure-funktionsapp kan du gå till Kudu-konsolen på fliken Inställningar för Azure-funktionen för att köra npm-installationskommandona. I det här fallet för att installera Azure Batch SDK för JavaScript.
Steg 2: Skapa ett Azure Batch-konto
Du kan skapa den från Azure-portalen eller från kommandoraden (PowerShell /Azure CLI).
Här följer kommandona för att skapa ett via Azure CLI.
Skapa en resursgrupp, hoppa över det här steget om du redan har en där du vill skapa Batch-kontot:
az group create -n "<resource-group-name>" -l "<location>"
Skapa sedan 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 ytterligare resurser i Azure Batch-kontot. En bra idé för produktionsmiljön är att använda Azure Key Vault för att lagra dessa nycklar. Du kan sedan skapa en Service principal för programmet. Med det här tjänstens huvudnamn kan programmet skapa en OAuth-token för att komma åt nycklar från nyckelvalvet.
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änstklient
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 Batch-kontonyckeln kopierad från föregående steg.
// 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);
Azure Batch-URI:n finns på fliken Översikt i Azure-portalen. Det är av formatet:
https://accountname.location.batch.azure.com
Se skärmbilden:
              
              
            
Steg 4: Skapa en Azure Batch-pool
En Azure Batch-pool består av flera virtuella datorer (även kallade Batch-noder). Azure Batch-tjänsten distribuerar uppgifterna på dessa noder och hanterar dem. Du kan definiera följande konfigurationsparametrar för din pool.
- Avbildningstyp för virtuell dator
 - Storleken på noder för virtuella datorer
 - Antal virtuella datornoder
 
Tips/Råd
Storleken och antalet virtuella datornoder beror till stor del på antalet aktiviteter som du vill köra parallellt och även själva aktiviteten. Vi rekommenderar att du testar för att fastställa det ideala talet och storleken.
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/Råd
Listan över avbildningar av virtuella Linux-datorer som är tillgängliga för Azure Batch och deras SKU-ID:n finns i Lista över avbildningar av virtuella datorer.
När poolkonfigurationen har definierats kan du skapa Azure Batch-poolen. Kommandot Batch-pool skapar Azure Virtual Machine-noder och förbereder dem för att vara redo att ta emot uppgifter som ska köras. Varje pool bör ha ett unikt ID som referens i efterföljande steg.
Följande kodfragment skapar 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)};
});
Du kan kontrollera statusen för poolen som skapats och se till att tillståndet är i "aktivt" innan du fortsätter med att skicka ett jobb till poolen.
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 exempelresultatobjekt som returneras 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
Ett Azure Batch-jobb är en logisk grupp med liknande 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 skulle köras parallellt och distribueras över flera noder, orkestrerade av Azure Batch-tjänsten.
Tips/Råd
Du kan använda egenskapen taskSlotsPerNode för att ange maximalt antal aktiviteter som kan köras samtidigt på en enda nod.
Förberedelseaktivitet
De vm-noder som skapas är tomma Ubuntu-noder. Ofta måste du installera en uppsättning program som förutsättningar. För Linux-noder kan du vanligtvis ha ett gränssnittsskript som installerar förutsättningarna innan de faktiska uppgifterna körs. Det kan dock vara vilket som helst programmerbart körbart program.
Shell-skriptet i det här exemplet installerar Python-pip och Azure Storage Blob SDK för Python.
Du kan ladda upp skriptet på ett Azure Storage-konto 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/Råd
En förberedelseaktivitet för ett jobb körs endast på de VM-noder där den specifika aktiviteten måste köras. Om du vill att kraven ska installeras på alla noder oavsett vilka uppgifter som körs på den kan du använda egenskapen startTask när du lägger till en pool. Du kan använda följande definition för förberedelseaktivitet som referens.
En förberedelseuppgift anges vid inlämningen av ett Azure Batch-jobb. Här följer några konfigurerbara förberedelseaktivitetsparametrar:
- ID: En unik identifierare för förberedelseaktiviteten
 - commandLine: Kommandorad för att köra den körbara uppgiften
 - 
              resourceFiles: Matris med objekt som innehåller information om filer som måste laddas ned för att den här uppgiften ska kunna köras.  Följande är dess alternativ 
- httpUrl: URL:en för filen som ska laddas ned
 - filePath: Lokal sökväg för att ladda ned och spara filen
 - fileMode: Gäller endast för Linux-noder, fileMode är i oktalt format med standardvärdet 0770
 
 - waitForSuccess: Om den är inställd på true körs aktiviteten inte vid förberedelseaktivitetsfel
 - runElevated: Ställ in den på true om förhöjd behörighet krävs för att köra uppgiften.
 
Följande kodfragment visar konfigurationsexemplet för förberedelse av aktivitetsskript:
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 krav som måste installeras för att dina uppgifter ska kunna köras kan du hoppa över förberedelseuppgifterna. Följande kod skapar ett jobb med visningsnamnet "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-uppdrag för ett jobb
Nu när vårt csv-jobb för processer har skapats kan vi skapa uppgifter för det jobbet. Förutsatt att vi har fyra containrar måste vi skapa fyra uppgifter, en för varje container.
Om vi tittar på Python-skriptet accepterar det två parametrar:
- containernamn: Lagringscontainern som du vill ladda ned filer från
 - mönster: En valfri parameter för filnamnsmönstret
 
Förutsatt att vi har fyra containrar "con1", "con2", "con3","con4" följande kod visar att skicka fyra uppgifter 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. Och var och en av uppgifterna körs på en nod i poolen med virtuella datorer som skapats. Om antalet aktiviteter överskrider antalet virtuella datorer i en pool eller egenskapen taskSlotsPerNode väntar aktiviteterna tills en nod görs tillgänglig. Den här orkestreringen hanteras automatiskt av Azure Batch.
Portalen har detaljerade vyer om uppgifter och jobbstatusar. Du kan också använda listan och hämta funktioner i Azure JavaScript SDK. Information finns i dokumentationslänken.
Nästa steg
- Lär dig mer om Batch-tjänstens arbetsflöde och primära resurser , till exempel pooler, noder, jobb och uppgifter.
 - Se Batch JavaScript-referensen för att utforska Batch-API:et.