Freigeben über


Erste Schritte mit Batch SDK für JavaScript

Lernen Sie die Grundlagen des Erstellens eines Batchclients in JavaScript mithilfe des 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-Konto mit Zugriffsrechten zum Erstellen von Batch- und Speicherdiensten verfügen.

Es wird empfohlen, die technische Übersicht über Azure Batch 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.

Diagramm, das die Szenarioarchitektur zeigt.

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 des Azure Batch SDK

Sie können das 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 Function-App können Sie auf der Registerkarte "Einstellungen" der Azure-Funktion zu "Kudu Console" wechseln, um die npm-Installationsbefehle auszuführen. In diesem Fall zum Installieren des Azure Batch SDK für JavaScript.

Schritt 2: Erstellen eines Azure Batch-Kontos

Sie können es über das Azure-Portal oder über die Befehlszeile (PowerShell /Azure CLI) erstellen.

Im Folgenden werden die Befehle zum Erstellen eines Objekts mittels 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 im Azure-Batchkonto zu erstellen. Eine bewährte Methode für die Produktionsumgebung ist die Verwendung von Azure Key Vault zum Speichern dieser Schlüssel. 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:

Azure-Batch-URI

Schritt 4: Erstellen eines Azure-Batchpools

Ein Azure Batch-Pool besteht aus mehreren virtuellen Computern (auch als Batchknoten bezeichnet). Der 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 ihre SKU-IDs verfügbar sind, finden Sie in der Liste der Images virtueller Computer.

Nachdem die Poolkonfiguration definiert wurde, können Sie den Azure-Batchpool erstellen. Der Befehl "Batchpool" erstellt Knoten des virtuellen Azure-Computers und bereitet sie für den Empfang von Aufgaben bereit, die ausgeführt werden sollen. 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-Batchauftrags

Ein Azure Batch-Auftrag ist eine logische Gruppe ähnlicher Aufgaben. In unserem Szenario lautet dies "Process csv to JSON". Jede Aufgabe hier könnte 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 TaskSlotsPerNode-Eigenschaft 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 Shellskript 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 startTask-Eigenschaft beim Hinzufügen eines Pools verwenden. Sie können die folgende Definition der Vorbereitungsaufgabe als Referenz verwenden.

Während der Übermittlung des Azure Batch-Auftrags wird eine Vorbereitungsaufgabe 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 mit Objekten, die Details zu Dateien angeben, welche zum Ausführen dieser Aufgabe heruntergeladen werden müssen. 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: Übermitteln von Azure-Batchaufgaben für einen Auftrag

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 Python-Skript betrachten, akzeptiert es zwei Parameter:

  • Containername: Der Speichercontainer zum Herunterladen von Dateien von
  • Muster: Ein optionaler Parameter des Dateinamenmusters

Angenommen, wir haben vier Container "con1", "con2", "con3", "con4", zeigt der folgende Code das Einreichen von vier Aufgaben an den zuvor erstellten Azure-Batch-Job "process 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");
        }
    });
});

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 verarbeitet.

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 auch die Liste verwenden und Funktionen im Azure JavaScript SDK abrufen. Details werden im Dokumentationslink bereitgestellt.

Nächste Schritte