Sdílet prostřednictvím


Začínáme se sadou Batch SDK pro JavaScript

Seznamte se se základy vytváření klienta Batch v JavaScriptu pomocí sady Azure Batch JavaScript SDK. Postupujeme krok za krokem, abychom porozuměli scénáři dávkové aplikace a pak ji nastavili pomocí JavaScriptu.

Požadavky

Tento článek předpokládá, že máte funkční znalosti JavaScriptu a znáte Linux. Předpokládá se také, že máte nastavený účet Azure s přístupovými právy k vytvoření služeb Batch a Storage.

Doporučujeme, abyste si přečetli článek Technický přehled služby Azure Batch, než budete postupovat podle kroků popsaných v tomto článku.

Vysvětlení scénáře

Tady máme jednoduchý skript napsaný v Pythonu, který stáhne všechny soubory CSV z kontejneru úložiště objektů blob v Azure a převede je do formátu JSON. Pokud chceme paralelně zpracovávat více kontejnerů účtu úložiště, můžeme skript nasadit jako úlohu služby Azure Batch.

architektura Azure Batch

Následující diagram znázorňuje, jak můžeme škálovat skript Pythonu pomocí Azure Batch a klienta.

Diagram znázorňující architekturu scénáře

Ukázka JavaScriptu nasadí dávkovou úlohu s přípravným úkolem (podrobněji vysvětleným později) a sadou úkolů v závislosti na počtu kontejnerů v účtu úložiště. Skripty si můžete stáhnout z úložiště GitHub.

Tip

Ukázka JavaScriptu v zadaném odkazu neobsahuje konkrétní kód, který by se nasadil jako aplikace funkcí Azure. Na následujících odkazech najdete pokyny k jejímu vytvoření.

Sestavení aplikace

Teď pojďme krok za krokem postupovat podle postupu sestavení javascriptového klienta:

Krok 1: Nainstalování sady SDK služby Azure Batch

Sadu Azure Batch SDK pro JavaScript můžete nainstalovat pomocí příkazu npm install.

npm install @azure/batch

Tento příkaz nainstaluje nejnovější verzi sady azure-batch JavaScript SDK.

Tip

V aplikaci Azure Function App můžete spouštět příkazy npm install z konzoly Kudu na kartě Nastavení funkce Azure. V takovém případě nainstalujte sadu Azure Batch SDK pro JavaScript.

Krok 2: Vytvoření účtu Azure Batch

Můžete ho vytvořit z Azure Portal nebo z příkazového řádku (PowerShell /Azure CLI).

Následující příkazy vytvoří účet prostřednictvím Azure CLI.

Vytvořte skupinu prostředků (tento krok přeskočte, pokud již máte skupinu prostředků, ve které chcete vytvořit účet Batch):

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

Dále vytvořte účet Azure Batch.

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

Každý účet Batch má odpovídající přístupové klíče. Tyto klíče jsou potřeba k vytvoření dalších prostředků v účtu Azure Batch. V produkčním prostředí je vhodné použít k uložení těchto klíčů službu Azure Key Vault. Potom můžete pro aplikaci vytvořit instanční objekt. Pomocí tohoto instančního objektu může aplikace vytvořit token OAuth pro přístup ke klíčům ve službě Key Vault.

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

Zkopírujte a uložte klíč, který použijete v dalších krocích.

Krok 3: Vytvoření klienta služby Azure Batch

Následující fragment kódu nejprve importuje modul javascriptu azure-batch a pak vytvoří klienta služby Batch. Nejprve musíte vytvořit objekt SharedKeyCredentials s klíčem účtu Batch, který jste zkopírovali v předchozím kroku.

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

Identifikátor URI služby Azure Batch najdete na kartě Přehled na webu Azure Portal. Je ve formátu:

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

Podívejte se na snímek obrazovky:

Identifikátor URI služby Azure Batch

Krok 4: Vytvoření fondu služby Azure Batch

Fond služby Azure Batch se skládá z několika virtuálních počítačů (označovaných také jako uzly služby Batch). Služba Azure Batch do uzlů nasazuje úkoly a spravuje je. Pro váš fond můžete definovat následující parametry konfigurace.

  • Typ image virtuálních počítačů
  • Velikost uzlů virtuálních počítačů
  • Počet uzlů virtuálních počítačů

Tip

Velikost a počet uzlů virtuálních počítačů úzce souvisí s počtem úkolů, které chcete paralelně spouštět, a se samotnými úkoly. K určení ideálního počtu a velikosti doporučujeme otestovat různé možnosti.

Následující fragment kódu vytvoří objekty parametrů konfigurace.

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

Seznam imagí virtuálních počítačů s Linuxem, které jsou dostupné pro Azure Batch, a ID jejich skladových jednotek (SKU) najdete v tématu se seznamem imagí virtuálních počítačů.

Jakmile je konfigurace fondu definovaná, můžete vytvořit fond služby Azure Batch. Příkaz k vytvoření fondu služby Batch vytvoří uzly virtuálních počítačů Azure a připraví je na příjem úkolů ke zpracování. Každý fond musí mít jedinečné ID, abyste na něj mohli odkazovat v dalších krocích.

Následující fragment kódu vytvoří fond služby Azure Batch.

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

Než budete pokračovat s odesláním úlohy do tohoto fondu, můžete zkontrolovat jeho stav a ověřit, že je „aktivní“.

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

Následuje ukázka objektu výsledků vráceného funkcí 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' }}

Krok 4: Odeslání úlohy služby Azure Batch

Úloha služby Azure Batch je logická skupina podobných úkolů. V našem scénáři je to "Zpracovat csv do FORMÁTU JSON". Každý z těchto úkolů může zpracovávat soubory CSV, které jsou v jednotlivých kontejnerech Azure Storage.

Tyto úkoly budou spouštěné paralelně, nasazené v několika uzlech a orchestrované službou Azure Batch.

Tip

Vlastnost taskSlotsPerNode můžete použít k určení maximálního počtu úloh, které se můžou souběžně spouštět na jednom uzlu.

Přípravný úkol

Vytvořené uzly virtuálních počítačů jsou prázdné uzly s Ubuntu. Často musíte pro splnění požadavků nainstalovat řadu programů. Pro uzly s Linuxem obvykle můžete mít skript prostředí, který požadavky nainstaluje před spuštěním vlastních úkolů. Může se ale jednat o jakýkoli programovatelný spustitelný soubor.

Skript prostředí v tomto příkladu nainstaluje Python-pip a sadu Azure Storage Blob SDK pro Python.

Skript můžete nahrát do účtu služby Azure Storage a vygenerovat identifikátor URI SAS pro přístup ke skriptu. Tento proces je také možné automatizovat pomocí sady JavaScript SDK služby Azure Storage.

Tip

Přípravný úkol pro úlohu se spustí pouze na uzlech virtuálních počítačů, na kterých je potřeba spustit konkrétní úkol. Pokud chcete, aby se požadované programy nainstalovaly na všech uzlech bez ohledu na to, jaké úkoly se na nich spouští, můžete během přidávání fondu použít vlastnost startTask. Pro srovnání můžete použít následující definici přípravného úkolu.

Přípravný úkol se zadává během odesílání úlohy služby Azure Batch. Tady jsou některé konfigurovatelné parametry přípravné úlohy:

  • ID: Jedinečný identifikátor přípravného úkolu.
  • commandLine: Příkazový řádek, který spustí spustitelný soubor s úkolem.
  • resourceFiles: Pole objektů poskytujících podrobnosti o souborech, které je potřeba stáhnout pro spuštění tohoto úkolu. Následují jeho možnosti:
    • httpUrl: Adresa URL souboru ke stažení
    • filePath: Místní cesta pro stažení a uložení souboru.
    • fileMode: Režim souboru, který lze použít pouze pro uzly s Linuxem, v osmičkovém formátu a s výchozí hodnotou 0770.
  • waitForSuccess: Pokud je tento parametr nastavený na hodnotu true, úkol se nespustí, pokud dojde k chybě přípravného úkolu.
  • runElevated: Nastavte tento parametr na hodnotu true, pokud jsou ke spuštění úkolu potřeba zvýšená oprávnění.

Následující fragment kódu ukazuje příklad konfigurace skriptu přípravného úkolu:

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

Pokud ke spuštění vašich úkolů není potřeba instalovat žádné požadavky, můžete přípravné úkoly přeskočit. Následující kód vytvoří úlohu se zobrazovaným názvem „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);
        }
    }
);

Krok 5: Odeslání úkolů služby Azure Batch pro úlohu

Nyní, když máme vytvořenou úlohu pro zpracování formátu CSV, vytvoříme pro tuto úlohu úkoly. Za předpokladu, že máme čtyři kontejnery, musíme vytvořit čtyři úkoly, jeden pro každý kontejner.

Když se podíváme na skript Pythonu, uvidíme, že přijímá dva parametry:

  • container name: Kontejner služby Storage, ze kterého se mají stáhnout soubory.
  • pattern: Volitelný parametr se vzorem názvu souboru.

Za předpokladu, že máme čtyři kontejnery "con1", "con2", "con3", "con4", následující kód ukazuje odeslání čtyř úkolů do úlohy Azure Batch "process CSV", kterou jsme vytvořili dříve.

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

Kód do fondu přidá několik úkolů. Každý z úkolů se provede na uzlu ve vytvořeném fondu virtuálních počítačů. Pokud počet úkolů překročí počet virtuálních počítačů ve fondu nebo vlastnost taskSlotsPerNode, úkoly počká, dokud nebude uzel dostupný. Tuto orchestraci automaticky zařizuje služba Azure Batch.

Na portálu jsou podrobná zobrazení stavů úkolů a úloh. Můžete také použít seznam a získat funkce v sadě Azure JavaScript SDK. Podrobnosti jsou uvedeny v dokumentaci.

Další kroky