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.
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:
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
- Seznamte se s pracovním postupem služby Batch a primárními prostředky , jako jsou fondy, uzly, úlohy a úkoly.
- Informace o rozhraní API služby Batch najdete v referenčních informacích k JavaScriptu služby Batch.