Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Obtenga información sobre los conceptos básicos de la creación de un cliente de Batch en JavaScript mediante Azure Batch SDK de JavaScript. Se realiza un enfoque paso a paso para comprender un escenario para una aplicación por lotes y, a continuación, se configura mediante JavaScript.
Prerrequisitos
En este artículo se da por supuesto que tiene conocimientos prácticos de JavaScript y que está familiarizado con Linux. Supone también que tiene una cuenta de Azure configurada con derechos de acceso para crear servicios de Azure Batch y Azure Storage.
Se recomienda leer Azure Batch Technical Overview antes de seguir los pasos descritos en este artículo.
Descripción del escenario
Aquí tenemos un script sencillo escrito en Python que descarga todos los archivos CSV de un contenedor de Blob Storage de Azure y los convierte en JSON. Para procesar varios contenedores de cuentas de almacenamiento en paralelo, podemos implementar el script como un trabajo de Azure Batch.
arquitectura de Azure Batch
En el diagrama siguiente se muestra cómo se puede escalar el script de Python mediante Azure Batch y un cliente.
Diagrama que muestra la arquitectura del escenario.
El ejemplo de JavaScript implementa un trabajo por lotes con una tarea de preparación (que se explica en detalle más adelante) y un conjunto de tareas en función del número de contenedores de la cuenta de almacenamiento. Puede descargar los scripts desde el repositorio de GitHub.
- Sample Code
- scripts de shell para tareas de preparación
- Procesador de Python que convierte CSV a JSON
Sugerencia
El ejemplo de JavaScript del vínculo especificado no contiene código específico que se va a implementar como una aplicación de funciones de Azure. Puede consultar los vínculos siguientes para obtener instrucciones para crear una.
- Creación de una aplicación de funciones
- Creación de una función de desencadenador de temporizador
Compilar la aplicación
Ahora, sigamos el proceso paso a paso para compilar el cliente de JavaScript:
Paso 1: Instalación del SDK de Azure Batch
Puede instalar Azure Batch SDK para JavaScript mediante el comando npm install.
npm install @azure/batch
Este comando instala la versión más reciente del SDK de JavaScript de Azure-batch.
Sugerencia
En una instancia de Azure Function App, puede ir a la "Consola Kudu" en la pestaña de configuración de la función de Azure para ejecutar los comandos npm install. En este caso, para instalar Azure Batch SDK para JavaScript.
Paso 2: Crear una cuenta de Azure Batch
Puede crearlo desde el portal Azure o desde la línea de comandos (PowerShell /Azure CLI).
A continuación se muestran los comandos para crear uno a través de Azure CLI.
Cree un grupo de recursos y omita este paso si ya tiene uno en el que desea crear la cuenta de Batch:
az group create -n "<resource-group-name>" -l "<location>"
A continuación, cree una cuenta de Azure Batch.
az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"
Cada cuenta de Batch tiene sus claves de acceso correspondientes. Estas claves son necesarias para crear más recursos en la cuenta de lotes de Azure. Un procedimiento recomendado para el entorno de producción es usar Azure Key Vault para almacenar estas claves. A continuación, puede crear un principal de servicio para la aplicación. Mediante esta entidad de servicio, la aplicación puede crear un token de OAuth para tener acceso a las claves del almacén de claves.
az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"
Copie y almacene la clave que se va a usar en los pasos posteriores.
Paso 3: Creación de un cliente de servicio de Azure Batch
El siguiente fragmento de código importa primero el módulo JavaScript de Azure-batch y, a continuación, crea un cliente de Servicio Batch. Primero debe crear un objeto SharedKeyCredentials con la clave de cuenta de Batch copiada del paso anterior.
// 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);
El Azure Batch URI se puede encontrar en la pestaña Información general del portal de Azure. Tiene el formato :
https://accountname.location.batch.azure.com
Consulte la captura de pantalla:
Paso 4: Crear un grupo de Azure Batch
Un grupo de Azure Batch consta de varias máquinas virtuales (también conocidas como nodos por lotes). Azure Batch servicio implementa las tareas en estos nodos y las administra. Puede definir los siguientes parámetros de configuración para el grupo.
- Tipo de imagen de máquina virtual
- Tamaño de los nodos de máquina virtual
- Número de nodos de máquina virtual
Sugerencia
El tamaño y el número de nodos de máquina virtual dependen en gran medida del número de tareas que desea ejecutar en paralelo y también de la propia tarea. Se recomienda realizar pruebas para determinar el número y el tamaño ideales.
El siguiente fragmento de código crea los objetos de parámetro de configuración.
// 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";
Sugerencia
Para obtener la lista de imágenes de máquina virtual Linux disponibles para Azure Batch y sus identificadores de SKU, consulte List of virtual machine images.
Una vez definida la configuración del grupo, puede crear el grupo de Azure Batch. El comando del grupo de Batch crea nodos de máquina virtual de Azure y los prepara para estar listos para recibir tareas que se van a ejecutar. Cada grupo debe tener un identificador único para referencia en los pasos posteriores.
El siguiente fragmento de código crea un grupo de 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)};
});
Puede comprobar el estado del grupo creado y asegurarse de que el estado es "activo" antes de continuar con el envío de un trabajo a ese grupo.
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");
}
}
});
A continuación se muestra un objeto de resultado de ejemplo devuelto por la función 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' }}
Paso 4: Enviar un trabajo de Azure Batch
Un trabajo de Azure Batch es un grupo lógico de tareas similares. En nuestro escenario, es "Procesar csv a JSON". Cada tarea podría procesar archivos CSV presentes en cada contenedor de Azure Storage.
Estas tareas se ejecutarían en paralelo e implementadas en varios nodos, orquestadas por el servicio Azure Batch.
Sugerencia
Puede usar la propiedad taskSlotsPerNode para especificar el número máximo de tareas que se pueden ejecutar simultáneamente en un solo nodo.
Tarea de preparación
Los nodos de máquina virtual creados son nodos ubuntu en blanco. A menudo, debe instalar un conjunto de programas como requisitos previos. Normalmente, para los nodos de Linux puede tener un script de shell que instale los requisitos previos antes de que se ejecuten las tareas reales. Sin embargo, podría ser cualquier ejecutable programable.
El script de shell de este ejemplo instala Python-pip y el SDK de Azure Storage Blob para Python.
Puede cargar el script en una cuenta de Azure Storage y generar un URI de SAS para acceder al script. Este proceso también se puede automatizar mediante el SDK de JavaScript de Azure Storage.
Sugerencia
Una tarea de preparación para un trabajo solo se ejecuta en los nodos de máquina virtual en los que es necesario ejecutar la tarea específica. Si desea instalar los requisitos previos en todos los nodos independientemente de las tareas que se ejecutan en él, puede usar la propiedad startTask al agregar un grupo. Puede usar la siguiente definición de tarea de preparación para referencia.
La tarea de preparación se especifica durante el envío de un trabajo de Azure Batch. A continuación se muestran algunos parámetros de tarea de preparación configurables:
- Identificador: identificador único para la tarea de preparación
- commandLine: línea de comandos para ejecutar el ejecutable de la tarea
- resourceFiles: matriz de objetos que proporcionan detalles de los archivos que se deben descargar para que esta tarea se ejecute. A continuación se muestran sus opciones
- httpUrl: la dirección URL del archivo que se va a descargar.
- filePath: ruta de acceso local para descargar y guardar el archivo
- fileMode: solo se aplica a los nodos de Linux, fileMode está en formato octal con un valor predeterminado de 0770
- waitForSuccess: si se establece en true, la tarea no se ejecuta si existen errores en la tarea de preparación.
- runElevated: establézcalo en true si se necesitan privilegios elevados para ejecutar la tarea.
El siguiente fragmento de código muestra el ejemplo de configuración del script de tarea de preparación:
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 no hay requisitos previos para instalar las tareas que se van a ejecutar, puede omitir las tareas de preparación. El código siguiente crea un trabajo con el nombre para mostrar "procesar archivos CSV".
// 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);
}
}
);
Paso 5: Enviar tareas de Azure Batch para un trabajo
Ahora que nuestro trabajo CSV de proceso está creado, vamos a crear tareas para esa tarea. Suponiendo que tenemos cuatro contenedores, tenemos que crear cuatro tareas, una para cada contenedor.
Si examinamos el script Python, acepta dos parámetros:
- nombre del contenedor: el contenedor de almacenamiento del que se van a descargar archivos
- pattern: parámetro opcional del patrón de nombre de archivo
Suponiendo que tenemos cuatro contenedores "con1", "con2", "con3","con4" el código siguiente muestra el envío de cuatro tareas al trabajo por lotes de Azure "process csv" que creamos anteriormente.
// 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");
}
});
});
El código agrega varias tareas al pool de tareas. Y cada una de las tareas se ejecuta en un nodo del grupo de máquinas virtuales creadas. Si el número de tareas supera el número de máquinas virtuales de un grupo o la propiedad taskSlotsPerNode, las tareas esperan hasta que un nodo está disponible. Esta orquestación se controla mediante Azure Batch automáticamente.
El portal tiene vistas detalladas sobre las tareas y los estados del trabajo. También puede usar la lista y obtener funciones en el SDK de JavaScript de Azure. Los detalles se proporcionan en el vínculo de documentación.
Pasos siguientes
- Conozca el flujo de trabajo y los recursos principales del servicio Batch, como grupos, nodos, trabajos y tareas.
- Consulte la referencia de JavaScript para explorar la API por lotes.