Partager via


Bien démarrer avec le kit de développement logiciel (SDK) Batch pour JavaScript

Découvrez les concepts de base de création d’un client Batch dans JavaScript à l’aide du kit de développement logiciel (SDK) JavaScript pour Azure Batch. Nous allons présenter pas à pas un scénario pour une application Batch, puis la configurer à l’aide de JavaScript.

Prérequis

Cet article suppose que vous avez acquis une connaissance pratique de JavaScript et que vous êtes familiarisé avec Linux. Il suppose également que vous disposez d’un compte Azure configuré avec des droits d’accès pour créer des services Batch et Stockage.

Nous vous recommandons de lire Présentation technique d’Azure Batch avant d’effectuer les étapes présentées dans cet article.

Présentation du scénario

Nous avons écrit ici un script simple dans Python qui permet de télécharger tous les fichiers csv à partir d’un conteneur de stockage Blob Azure et de les convertir au format JSON. Pour traiter plusieurs conteneurs du compte de stockage en parallèle, nous pouvons déployer le script en tant que travail Azure Batch.

Architecture Azure Batch

Le diagramme suivant illustre la façon dont nous pouvons mettre à l’échelle le script Python à l’aide d’Azure Batch et d’un client.

Diagramme montrant l’architecture du scénario.

L’exemple JavaScript déploie un traitement par lots avec une tâche de préparation (expliquée en détail plus loin) ainsi qu’un ensemble de tâches en fonction du nombre de conteneurs du compte de stockage. Vous pouvez télécharger les scripts à partir du référentiel GitHub.

Conseil

L’exemple JavaScript du lien spécifié ne contient pas de code spécifique à déployer en tant qu’application de fonction Azure. Vous pouvez vous reporter aux liens suivants pour connaître les instructions à suivre pour en créer une.

Créer l’application

À présent, laissez-nous suivre la procédure étape par étape de création du client JavaScript :

Étape 1 : installer le Kit de développement logiciel (SDK) Azure Batch

Vous pouvez installer le kit de développement logiciel (SDK) Azure Batch pour JavaScript à l’aide de la commande npm install.

npm install @azure/batch

Cette commande installe la dernière version du kit de développement logiciel (SDK) Azure Batch pour JavaScript.

Conseil

Dans une application Azure Function App, vous pouvez accéder à « Kudu Console » dans l’onglet Paramètres de la fonction Azure pour exécuter les commandes npm install, dans ce cas, pour installer le kit de développement logiciel (SDK) Azure Batch pour JavaScript.

Étape 2 : Créer un compte Azure Batch

Vous pouvez le créer à partir du portail Azure ou de la ligne de commande (PowerShell /Azure CLI).

Ci-après figurent les commandes permettant d’en créer un via Azure CLI.

Créez un groupe de ressources. Ignorez cette étape si vous en avez déjà un là où vous souhaitez créer le compte Batch :

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

Créez ensuite un compte Azure Batch.

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

Chaque compte Batch possède ses clés d’accès correspondantes. Ces clés sont nécessaires pour créer d’autres ressources dans un compte Azure Batch. Pour un environnement de production, il est conseillé d’utiliser Azure Key Vault pour stocker ces clés. Vous pouvez alors créer un principal de service pour l’application. En utilisant ce principal de service, l’application peut créer un jeton OAuth pour les clés d’accès dans le coffre de clés.

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

Copiez et stockez la clé à utiliser dans les étapes suivantes.

Étape 3 : créer un client du service Azure Batch

L’extrait de code suivant importe tout d’abord le module JavaScript pour Azure Batch, puis crée un client du service Batch. Vous devez d’abord créer un objet SharedKeyCredentials avec la clé du compte Batch copiée à l’étape précédente.

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

L’URI Azure Batch se trouve dans l’onglet Vue d’ensemble du portail Azure. Son format est le suivant :

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

Reportez-vous à la capture d’écran :

URI Azure Batch

Étape 4 : créer un pool Azure Batch

Un pool Azure Batch se compose de plusieurs machines virtuelles (également appelées nœuds Batch). Le service Azure Batch déploie les tâches sur ces nœuds et les gère. Vous pouvez définir les paramètres de configuration suivants pour le pool.

  • Type d’image de machine virtuelle
  • Taille des nœuds de machine virtuelle
  • Nombre de nœuds de machine virtuelle

Conseil

La taille et le nombre de nœuds de machine virtuelle dépendent en grande partie du nombre de tâches à exécuter en parallèle et également de la tâche proprement dite. Nous vous recommandons d’effectuer des tests pour déterminer la taille et le nombre idéaux.

L’extrait de code suivant crée les objets de paramètre de configuration.

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

Conseil

Pour obtenir la liste des images de machine virtuelle Linux disponibles pour Azure Batch et de leurs ID de référence (SKU), consultez la section Liste des images de machine virtuelle.

Une fois la configuration du pool définie, vous pouvez créer le pool Azure Batch. La commande du pool Batch crée des nœuds de machine virtuelle Azure et les prépare à recevoir les tâches à exécuter. Chaque pool doit posséder un ID unique à titre de référence pour les étapes suivantes.

L’extrait de code suivant crée un pool 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)};
});

Vous pouvez vérifier l’état du pool créé et vous assurer que l’état est « actif » avant de poursuivre avec la soumission d’un travail à ce pool.

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

Ci-après figure un exemple d’objet de résultat retourné par la fonction 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' }}

Étape 4 : soumettre un travail Azure Batch

Un travail Azure Batch est un groupe logique de tâches similaires. Dans notre scénario, il s’agit de « traiter du contenu CSV au format JSON ». Ici, chaque tâche peut traiter les fichiers CSV présents dans chaque conteneur Stockage Azure.

Ces tâches sont exécutées en parallèle et déployées sur plusieurs nœuds, et orchestrées par le service Azure Batch.

Conseil

Vous pouvez utiliser la propriété taskSlotsPerNode pour spécifier le nombre maximal de tâches pouvant s’exécuter simultanément sur un seul nœud.

Tâche de préparation

Les nœuds de machine virtuelle créés sont des nœuds Ubuntu vides. Il arrive souvent que vous deviez installer un ensemble de programmes comme composants requis. En règle générale, pour les nœuds Linux, vous pouvez disposer d’un script Shell qui installe les composants requis avant l’exécution des tâches réelles. Cependant, il peut s’agir de n’importe quel exécutable programmable.

Le script Shell de cet exemple installe Python-pip et le Kit de développement logiciel (SDK) Stockage Blob Azure pour Python.

Vous pouvez charger le script sur un compte de stockage Azure et générer un URI SAS pour accéder au script. Ce processus peut également être automatisé à l’aide du kit de développement logiciel (SDK) JavaScript pour Stockage Azure.

Conseil

Une tâche de préparation d’un travail s’exécute uniquement sur les nœuds de machine virtuelle où la tâche donnée doit s’exécuter. Si vous voulez installer les composants requis sur tous les nœuds, quelles que soient les tâches exécutées dessus, vous pouvez utiliser la propriété startTask lorsque vous ajoutez un pool. Vous pouvez utiliser la définition de tâche de préparation suivante à titre de référence.

Une tâche de préparation est spécifiée lors de la soumission d’un travail Azure Batch. Voici quelques paramètres de tâche de préparation configurables :

  • ID : identificateur unique de la tâche de préparation
  • commandLine : ligne de commande pour exécuter la tâche exécutable
  • resourceFiles : tableau des objets qui fournissent des détails des fichiers qui doivent être téléchargés pour l’exécution de cette tâche. Ses options sont les suivantes :
    • httpUrl : URL du fichier à télécharger
    • filePath : chemin d’accès local pour télécharger et enregistrer le fichier
    • fileMode : applicable uniquement pour les nœuds Linux, fileMode est au format octal avec la valeur 0770 par défaut
  • waitForSuccess : si cette option est définie sur la valeur true, la tâche ne s’exécute pas en cas d’échec des tâches de préparation
  • runElevated : définissez cette option sur la valeur True si des privilèges élevés sont requis pour l’exécution de la tâche.

L’extrait de code suivant illustre un exemple de configuration de script d’une tâche de préparation :

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

Si aucun composant requis ne doit être installé pour l’exécution de vos tâches, vous pouvez ignorer les tâches de préparation. Le code suivant crée un travail dont le nom d’affichage est « 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);
        }
    }
);

Étape 5 : soumettre des tâches Azure Batch pour un travail

Maintenant que le travail de traitement des fichiers csv est créé, nous allons créer des tâches pour celui-ci. En supposant que nous possédons quatre conteneurs, nous devons créer quatre tâches, une par conteneur.

Le script Python accepte deux paramètres :

  • nom du conteneur : conteneur de stockage à partir duquel télécharger des fichiers
  • modèle : paramètre facultatif d’un modèle de nom de fichier

En supposant que nous disposons de quatre conteneurs « con1 », « con2 », « con3 » et « con4 », le code suivant illustre la soumission des tâches pour le travail Azure Batch « process csv » que nous avons créé précédemment.

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

Le code permet d’ajouter plusieurs tâches au pool. Chaque tâche est exécutée sur un nœud dans le pool de machines virtuelles créé. Si le nombre de tâches dépasse le nombre de machines virtuelles définies dans un pool ou la propriété taskSlotsPerNode, les tâches attendent qu’un nœud soit de nouveau disponible. Cette orchestration est gérée automatiquement par Azure Batch.

Le portail contient des vues détaillées sur les états des tâches et du travail. Vous pouvez également utiliser la liste et récupérer des fonctions dans le kit de développement logiciel (SDK) JavaScript Azure. Des détails sont indiqués dans le lien de la documentation.

Étapes suivantes