Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Lernen Sie die Grundlagen des Erstellens eines Batchclients in JavaScript mit Azure Batch JavaScript SDK kennen. Wir gehen schrittweise ein, um ein Szenario für eine Batchanwendung zu verstehen und dann mit JavaScript einzurichten.
Voraussetzungen
In diesem Artikel wird davon ausgegangen, dass Sie über kenntnisse von JavaScript und kenntnissen mit Linux verfügen. Außerdem wird davon ausgegangen, dass Sie über ein Azure Kontosetup mit Zugriffsrechten zum Erstellen von Batch- und Speicherdiensten verfügen.
Es wird empfohlen, Azure Batch Technical Overview zu lesen, bevor Sie die in diesem Artikel beschriebenen Schritte durchgehen.
Das Szenario verstehen
Hier haben wir ein einfaches Skript in Python geschrieben, das alle CSV-Dateien aus einem Azure Blob Storage-Container herunterlädt und sie in JSON konvertiert. Um mehrere Speicherkontocontainer parallel zu verarbeiten, können wir das Skript als Azure Batch Auftrag bereitstellen.
Azure Batch-Architektur
Das folgende Diagramm zeigt, wie wir das Python Skript mithilfe von Azure Batch und einem Client skalieren können.
Das JavaScript-Beispiel stellt einen Batchauftrag mit einer Vorbereitungsaufgabe bereit (weiter unten erläutert) und eine Reihe von Aufgaben abhängig von der Anzahl der Container im Speicherkonto. Sie können die Skripts aus dem GitHub Repository herunterladen.
Tipp
Das JavaScript-Beispiel in der angegebenen Verknüpfung enthält keinen spezifischen Code, der als Azure-Funktions-App bereitgestellt werden soll. Anweisungen zum Erstellen finden Sie unter den folgenden Links.
Erstellen der Anwendung
Lassen Sie uns nun schritt für Schritt den Prozess ausführen, um den JavaScript-Client zu erstellen:
Schritt 1: Installieren Azure Batch SDK
Sie können Azure Batch SDK für JavaScript mithilfe des npm-Installationsbefehls installieren.
npm install @azure/batch
Mit diesem Befehl wird die neueste Version des Azure-batch JavaScript SDK installiert.
Tipp
In einer Azure Funktions-App können Sie auf der Registerkarte "Einstellungen" der Azure-Funktion zu "Kudu Console" wechseln, um die npm-Installationsbefehle auszuführen. In diesem Fall installieren Sie Azure Batch SDK für JavaScript.
Schritt 2: Erstellen eines Azure Batch Kontos
Sie können es über das portal Azure oder über die Befehlszeile (PowerShell /Azure CLI) erstellen.
Im Folgenden werden die Befehle zum Erstellen einer über Azure CLI aufgeführt.
Erstellen Sie eine Ressourcengruppe, überspringen Sie diesen Schritt, wenn Sie bereits über eine Ressource verfügen, an der Sie das Batchkonto erstellen möchten:
az group create -n "<resource-group-name>" -l "<location>"
Erstellen Sie als Nächstes ein Azure Batch Konto.
az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"
Jedes Batchkonto verfügt über die entsprechenden Zugriffsschlüssel. Diese Schlüssel sind erforderlich, um weitere Ressourcen in Azure Batchkonto zu erstellen. Eine bewährte Methode für die Produktionsumgebung besteht darin, Azure Key Vault zum Speichern dieser Schlüssel zu verwenden. Anschließend können Sie einen Dienstprinzipal für die Anwendung erstellen. Mithilfe dieses Dienstprinzipals kann die Anwendung ein OAuth-Token erstellen, um auf Schlüssel aus dem Schlüsseltresor zuzugreifen.
az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"
Kopieren Und speichern Sie den Schlüssel, der in den folgenden Schritten verwendet werden soll.
Schritt 3: Erstellen eines Azure Batch-Dienstclients
Der folgende Codeausschnitt importiert zuerst das JavaScript-Modul azure-batch und erstellt dann einen Batchdienstclient. Sie müssen zuerst ein SharedKeyCredentials-Objekt mit dem Batchkontoschlüssel erstellen, der aus dem vorherigen Schritt kopiert wurde.
// 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);
Der Azure Batch-URI befindet sich auf der Registerkarte "Übersicht" des Azure Portals. Dies ist das Format:
https://accountname.location.batch.azure.com
Weitere Informationen finden Sie im Screenshot:
Schritt 4: Erstellen eines Azure Batch-Pools
Ein Azure Batch Pool besteht aus mehreren virtuellen Computern (auch als Batchknoten bezeichnet). Azure Batch Dienst stellt die Aufgaben auf diesen Knoten bereit und verwaltet sie. Sie können die folgenden Konfigurationsparameter für Ihren Pool definieren.
- Art des VM-Images
- Größe von Knoten des virtuellen Computers
- Anzahl der Knoten des virtuellen Computers
Tipp
Die Größe und Anzahl der Knoten des virtuellen Computers hängen weitgehend von der Anzahl der Aufgaben ab, die Sie parallel ausführen möchten, und auch von der Aufgabe selbst. Es wird empfohlen, tests durchzuführen, um die ideale Zahl und Größe zu ermitteln.
Der folgende Codeausschnitt erstellt die Konfigurationsparameterobjekte.
// 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
Eine Liste der linux-VM-Images, die für Azure Batch und deren SKU-IDs verfügbar sind, finden Sie unter List of virtual machine images.For the list of Linux VM images available for Azure Batch and their SKU IDs, see List of virtual machine images.
Nachdem die Poolkonfiguration definiert wurde, können Sie den Azure Batch Pool erstellen. Der Befehl „Batch-Pool“ erstellt Azure-VM-Knoten und bereitet sie darauf vor, um Aufgaben zur Ausführung zu empfangen. Jeder Pool sollte eine eindeutige ID für den Verweis in den nachfolgenden Schritten haben.
Der folgende Codeausschnitt erstellt einen 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)};
});
Sie können den Status des erstellten Pools überprüfen und sicherstellen, dass der Status "aktiv" ist, bevor Sie mit der Übermittlung eines Auftrags an diesen Pool fortfahren.
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");
}
}
});
Es folgt ein Beispielergebnisobjekt, das von der Funktion "pool.get" zurückgegeben wird.
{
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' }}
Schritt 4: Übermitteln eines Azure Batch Auftrags
Ein Azure Batch Auftrag ist eine logische Gruppe ähnlicher Aufgaben. In unserem Szenario lautet dies "Prozess csv in JSON". Jede Aufgabe kann csv-Dateien verarbeiten, die in jedem Azure Storage Container vorhanden sind.
Diese Aufgaben werden parallel ausgeführt und über mehrere Knoten hinweg bereitgestellt, die vom Azure Batch-Dienst koordiniert werden.
Tipp
Mit der eigenschaft taskSlotsPerNode können Sie die maximale Anzahl von Aufgaben angeben, die gleichzeitig auf einem einzelnen Knoten ausgeführt werden können.
Vorbereitungsvorgang
Die erstellten VM-Knoten sind leere Ubuntu-Knoten. Häufig müssen Sie eine Reihe von Programmen als Voraussetzungen installieren. In der Regel können Sie für Linux-Knoten über ein Shellskript verfügen, das die erforderlichen Komponenten installiert, bevor die eigentlichen Aufgaben ausgeführt werden. Es kann jedoch eine beliebige programmierbare ausführbare Datei sein.
Das skript shell in diesem Beispiel installiert Python Pip und das Azure Storage Blob SDK für Python.
Sie können das Skript in ein Azure Storage-Konto hochladen und einen SAS-URI generieren, um auf das Skript zuzugreifen. Dieser Prozess kann auch mithilfe des Azure Storage JavaScript SDK automatisiert werden.
Tipp
Eine Vorbereitungsaufgabe für einen Auftrag wird nur auf den VM-Knoten ausgeführt, auf denen die jeweilige Aufgabe ausgeführt werden muss. Wenn erforderliche Komponenten auf allen Knoten installiert werden sollen, unabhängig von den aufgaben, die darauf ausgeführt werden, können Sie die eigenschaft startTask verwenden, während Sie einen Pool hinzufügen. Sie können die folgende Definition der Vorbereitungsaufgabe als Referenz verwenden.
Während der Übermittlung eines Azure Batch-Jobs wird ein Vorbereitungsvorgang angegeben. Im Folgenden sind einige konfigurierbare Vorbereitungsaufgabenparameter aufgeführt:
- ID: Ein eindeutiger Bezeichner für den Vorbereitungsvorgang
- commandLine: Befehlszeile zum Ausführen der ausführbaren Aufgabe
-
resourceFiles: Array von Objekten, die Details zu Dateien bereitstellen, die heruntergeladen werden müssen, damit diese Aufgabe ausgeführt werden kann. Im Folgenden sind die Optionen aufgeführt.
- httpUrl: Die URL der herunterzuladenden Datei
- filePath: Lokaler Pfad zum Herunterladen und Speichern der Datei
- fileMode: Gilt nur für Linux-Knoten, fileMode ist im oktalen Format mit dem Standardwert 0770
- waitForSuccess: Wenn dieser Wert auf "true" festgelegt ist, wird der Vorgang bei Vorbereitungsaufgabenfehlern nicht ausgeführt.
- runElevated: Legen Sie ihn auf "true" fest, wenn zum Ausführen der Aufgabe erhöhte Rechte erforderlich sind.
Der folgende Codeausschnitt zeigt das Konfigurationsbeispiel für die Konfiguration des Vorbereitungsaufgabenskripts:
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"}}}
Wenn zur Ausführung Ihrer Aufgaben keine erforderlichen Komponenten installiert werden müssen, können Sie die Vorbereitungsaufgaben überspringen. Der folgende Code erstellt einen Auftrag mit dem Anzeigenamen "Csv-Dateien verarbeiten".
// 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);
}
}
);
Schritt 5: Azure Batch-Aufgaben für einen Auftrag übermitteln
Nachdem unser Prozess-CSV-Auftrag erstellt wurde, erstellen wir Aufgaben für diesen Auftrag. Vorausgesetzt, wir haben vier Container, wir müssen vier Aufgaben erstellen, eine für jeden Container.
Wenn wir das Skript Python betrachten, werden zwei Parameter akzeptiert:
- Containername: Der Speichercontainer zum Herunterladen von Dateien von
- Muster: Ein optionaler Parameter des Dateinamenmusters
Angenommen, wir haben vier Container "con1", "con2", "con3", "con4". Der folgende Code zeigt, wie vier Aufgaben an den zuvor erstellten Azure-Batch-Job "process csv" übermittelt werden.
// 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");
}
});
});
Der Code fügt dem Pool mehrere Aufgaben hinzu. Und jede der Aufgaben wird auf einem Knoten im Pool von virtuellen Computern ausgeführt, die erstellt wurden. Wenn die Anzahl der Vorgänge die Anzahl der virtuellen Computer in einem Pool oder der TaskSlotsPerNode-Eigenschaft überschreitet, warten die Aufgaben, bis ein Knoten verfügbar gemacht wird. Diese Orchestrierung wird automatisch von Azure Batch behandelt.
Das Portal enthält detaillierte Ansichten zu den Aufgaben und Auftragsstatus.The portal has detailed views on the tasks and job statuses. Sie können die Liste auch verwenden und Funktionen im Azure JavaScript SDK abrufen. Details werden im Dokumentationslink bereitgestellt.
Nächste Schritte
- Erfahren Sie mehr über den Workflow des Batch-Diensts und primäre Ressourcen wie Pools, Knoten, Aufträge und Aufgaben.
- Sehen Sie sich die Batch-JavaScript-Referenz an, um die Batch-API zu erkunden.