Megosztás a következőn keresztül:


A JavaScripthez készült Batch SDK használatának első lépései

Ismerje meg a Batch-ügyfél JavaScriptben való létrehozásának alapjait Azure Batch JavaScript SDK használatával. Lépésről lépésre haladva megértjük a kötegelt alkalmazások forgatókönyvét, majd JavaScript használatával állítjuk be.

Előfeltételek

Ez a cikk feltételezi, hogy rendelkezik a JavaScripttel és a Linux ismeretével. Azt is feltételezi, hogy rendelkezik egy, a Batch- és Storage-szolgáltatások létrehozásához szükséges hozzáférési jogosultságokkal ellátott Azure-fiókkal.

A jelen cikk lépéseinek végrehajtása előtt javasoljuk, hogy olvassa el az Azure Batch technikai áttekintését.

A forgatókönyv megismerése

Itt egy pythonban írt egyszerű szkriptünk van, amely letölti az összes csv-fájlt egy Azure Blob Storage-tárolóból, és JSON-ra konvertálja őket. Több tárfióktároló párhuzamos feldolgozásához Azure Batch-feladatként helyezheti üzembe a szkriptet.

Azure Batch architektúra

Az alábbi ábra azt mutatja be, hogyan skálázhatjuk a Python-szkriptet Azure Batch és egy ügyfél használatával.

A forgatókönyv architektúrát bemutató ábra.

A JavaScript-minta üzembe helyez egy kötegelt feladatot egy előkészítési feladattal (a későbbiekben részletesen ismertetve), valamint egy feladatkészlettel a tárfiókban található tárolók számától függően. A szkripteket a GitHub-adattárból töltheti le.

Tipp

A megadott hivatkozásBan található JavaScript-minta nem tartalmaz olyan kódot, amely Azure-függvényalkalmazásként üzembe helyezhető. Az alábbi hivatkozások azon útmutatásokra mutatnak, amelyek segítségével létrehozhatja azt.

Az alkalmazás létrehozása

Most lépésről lépésre haladjunk végig a JavaScript-ügyfél létrehozásán:

1. lépés: Az Azure Batch SDK telepítése

Az npm telepítési paranccsal telepítheti Azure Batch JavaScripthez készült SDK-t.

npm install @azure/batch

Ez a parancs telepíti az azure-batch JavaScript SDK legújabb verzióját.

Tipp

Egy Azure-függvényalkalmazásban az npm install parancs futtatása az alkalmazás Beállítások lapjának „Kudu konzol” felületéről történik. Ebben az esetben telepítse Azure Batch JavaScripthez készült SDK-t.

2. lépés: Azure Batch-fiók létrehozása

Létrehozhatja a Azure Portal vagy parancssorból (PowerShell /Azure CLI).

Az alábbi parancsokkal az Azure CLI-n keresztül hozhat létre egy fiókot.

Hozzon létre egy erőforráscsoportot (hagyja ki ezt a lépést, ha a Batch-fiók létrehozásának helyén már található ilyen):

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

A következő lépés az Azure Batch-fiók létrehozása.

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

Minden egyes Batch-fiók megfelelő hozzáférési kulcsokkal rendelkezik. Ezekre a kulcsokra szükség van további erőforrások az Azure Batch-fiókban történő létrehozásához. Éles környezetben a kulcsok tárolására tanácsos az Azure Key Vaultot használni. Ezután létrehozhatja az alkalmazáshoz tartozó egyszerű szolgáltatást. Ezen egyszerű szolgáltatás használatával az alkalmazás képes OAuth-token létrehozására a Key Vaultban tárolt kulcsokhoz történő hozzáféréshez.

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

Másolja és mentse a következő lépésekben használni kívánt kulcsot.

3. lépés: Azure Batch-szolgáltatásügyfél létrehozása

A kódrészletet követve először importálja az azure-batch JavaScript modult, majd létrehoz egy Batch Service-ügyfelet. Először létre kell hoznia egy SharedKeyCredentials objektumot az előző lépésből átmásolt Batch-fiókkulccsal.

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

Az Azure Batch URI az Azure Portal Áttekintés lapján található. Ennek formátuma:

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

Tekintse meg a következő képernyőképet:

Azure Batch URI

4. lépés: Azure Batch-készlet létrehozása

Az Azure Batch-készlet több virtuális gépből áll (ezek Batch-csomópontokként is ismertek). Az Azure Batch-szolgáltatás elvégzi a feladatok központi telepítését ezeken a csomópontokon, és kezeli azokat. A készlet esetében az alábbi konfigurációs paramétereket adhatja meg.

  • A virtuális gép rendszerképének típusa
  • A virtuálisgép-csomópontok métere
  • A virtuálisgép-csomópontok száma

Tipp

A virtuálisgép-csomópontok mérete és száma nagymértékben a párhuzamosan futtatni kívánt feladatok számától és magától a feladattól függ. Javasoljuk, hogy teszteléssel határozza meg az ideális számot és méretet.

Az alábbi kódrészlet a konfigurációsparaméter-objektumokat hozza létre.

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

Tipp

Az Azure Batch számára elérhető linuxos virtuális gépek rendszerképét és azok termékváltozat-azonosítóinak listáját a virtuálisgép-rendszerképek listája tartalmazza.

A készletkonfiguráció megadását követően létrehozhatja az Azure Batch-készletet. A Batch-készlet parancs Azure-beli virtuálisgép-csomópontokat hoz létre, és felkészíti azokat a végrehajtandó feladatok fogadására. Mindegyik készletnek egyedi azonosítóval kell rendelkeznie a következő lépésekben történő hivatkozáshoz.

Az alábbi kódrészlet egy Azure Batch-készletet hoz létre.

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

Ellenőrizheti a létrehozott készlet állapotát, és a készletbe történő feladatbeküldés előtt meggyőződhet arról, hogy a készlet „aktív” állapotban van.

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

Az alábbiakban a pool.get függvény által visszaadott objektumra láthat példát.

{
  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' }}

4. lépés: Azure Batch-feladat elküldése

Az Azure Batch-feladatok hasonló feladatok logikai csoportjai. A mi esetünkben ez a "Csv feldolgozása JSON-ra". Itt minden feladat lehet az egyes Azure Storage-tárolókban található CSV-fájlok feldolgozása.

E feladatok párhuzamosan futtathatók és több csomóponton üzembe helyezhetők, a vezénylésüket az Azure Batch-szolgáltatás végzi.

Tipp

A taskSlotsPerNode tulajdonsággal megadhatja az egy csomóponton egyidejűleg futtatható tevékenységek maximális számát.

Előkészítő feladat

A virtuálisgép-csomópontok üres Ubuntu-csomópontokat hoztak létre. Gyakori eset, hogy előfeltételként néhány programot kell telepíteni. Linux-csomópontok esetében általában rendelkezhet olyan héjszkripttel, amely az aktuális feladatok futtatása előtt telepíti az előfeltételeket. Ez azonban bármilyen programozható végrehajtható fájl lehet.

A jelen példában szereplő rendszerhéjszkript telepíti a Python-pipet és a Pythonhoz készült Azure Storage Blob SDK-t.

Feltöltheti a szkriptet egy Azure Storage-fiókba, és létrehozhat egy SAS URI-t a szkripthez történő hozzáféréshez. Ez a folyamat az Azure Storage JavaScript SDK-val is automatizálható.

Tipp

Az adott feladathoz tartozó előkészítő feladat csak azokon a virtuálisgép-csomópontokon fut, ahol az adott feladatnak futnia kell. Ha azt szeretné, hogy az előfeltételek az összes csomóponton telepítve legyenek (függetlenül az azokon futó feladatoktól), készlet hozzáadásakor használhatja a startTask tulajdonságot. Referenciaként az alábbi előkészítőfeladat-meghatározás használható.

Az Azure Batch-feladat beküldése során megtörténik egy előkészítő feladat meghatározása. Az alábbiakban néhány konfigurálható előkészítési feladatparamétert talál:

  • ID: Az előkészítő feladat egyedi azonosítója.
  • commandLine: A feladat végrehajtható fájljának végrehajtására szolgáló parancssor.
  • resourceFiles: A jelen feladat futtatásához letöltendő fájlok részletes adatait biztosító objektumtömbök. Ennek beállítási lehetőségei a következők:
    • httpUrl: A letölteni kívánt fájl URL-címe
    • filePath: A fájl helyi letöltési és mentési elérési útja.
    • fileMode: Csak Linux-csomópontokra vonatkozik, a fileMode formátuma oktális, alapértelmezett értéke 0770.
  • waitForSuccess: Ha a beállítása igaz, a feladat nem fut előkészítőtevékenység-hibák esetében.
  • runElevated: Állítsa igaz értékre, ha a feladat futtatásához emelt szintű jogosultságokra van szükség.

Az alábbi kódrészleten az előkészítő feladat egy szkriptkonfigurációs mintáját láthatjuk:

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

Ha a feladatok futtatásához nem szükséges előfeltételeket telepíteni, kihagyhatja az előkészítő tevékenységeket. Az alábbi kód „CSV-fájlok feldolgozása” megjelenített névvel ellátott feladatot hoz létre.

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

5. lépés: Azure Batch-feladatok elküldése egy feladathoz

A CSV-feldolgozási feladat létrehozását követően hozzunk létre tevékenységeket ehhez a feladathoz. Feltételezve, hogy négy tárolóval rendelkezünk, négy tevékenységet hozunk létre – minden tárolóhoz egyet.

A Python-szkript két paramétert fogad el:

  • container name: Az a Storage-tároló, amelyből a fájlokat letöltjük.
  • pattern: A fájlnév-minta választható paramétere.

Feltételezve, hogy négy "con1", "con2", "con3", "con4" tárolóval rendelkezünk, a következő kód azt mutatja, hogy négy tevékenységet küldünk el a korábban létrehozott Azure batch-feladatnak (folyamat csv).

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

A kód több tevékenységet ad hozzá a készlethez. Minden egyes tevékenység a létrehozott virtuális gépek készletének egyik csomópontján lesz végrehajtva. Ha a tevékenységek száma meghaladja a készletben lévő virtuális gépek számát vagy a taskSlotsPerNode tulajdonságot, a tevékenységek megvárják, amíg elérhetővé válik egy csomópont. Ennek vezénylését az Azure Batch automatikusan elvégzi.

A portálon részletesen megtekinthetők a tevékenységek és a feladatok állapotai. A listát is használhatja, és függvényeket kérhet le az Azure JavaScript SDK-ban. Részletes információkat a dokumentáció hivatkozását megnyitva talál.

Következő lépések