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 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:
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
- Ismerje meg a Batch szolgáltatás munkafolyamatát és az elsődleges erőforrásokat , például készleteket, csomópontokat, feladatokat és tevékenységeket.
- A Batch API megismeréséhez tekintse meg a Batch JavaScript-referenciáját .