Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Узнайте основы построения Batch-клиента в JavaScript с помощью пакетная служба Azure JavaScript SDK. Пошаговый подход к пониманию сценария пакетного приложения и его настройке с помощью JavaScript.
Предпосылки
В этой статье предполагается, что вы знакомы с JavaScript и знакомы с Linux. Предполагается также, что у вас уже настроена учетная запись Azure с правами доступа, позволяющими создавать службы Batch и хранилища.
Мы рекомендуем прочитать пакетная служба Azure Technical Overview перед выполнением действий, описанных в этой статье.
Ознакомление со сценарием
Здесь у нас есть простой скрипт, написанный на Python, который скачивает все CSV-файлы из контейнера хранилища BLOB-объектов Azure и преобразует их в JSON. Для параллельной обработки нескольких контейнеров учетных записей хранения можно развернуть скрипт в качестве задания пакетная служба Azure.
архитектура пакетная служба Azure
На следующей схеме показано, как масштабировать скрипт Python с помощью пакетная служба Azure и клиента.
Пример JavaScript развертывает пакетное задание с задачей подготовки (подробно описано далее) и набор задач в зависимости от количества контейнеров в учетной записи хранения. Скрипты можно скачать из репозитория GitHub.
- Пример кода
- Скрипты оболочки задач подготовки
- Преобразователь CSV в JSON на Python
Подсказка
Пример JavaScript в указанной ссылке не содержит конкретный код для развертывания в качестве приложения-функции Azure. Инструкции по его созданию см. по следующим ссылкам.
Создайте приложение
Теперь давайте следуйте этапу процесса, чтобы создать клиент JavaScript:
Шаг 1. Установка пакета SDK для пакетная служба Azure
Пакет SDK пакетная служба Azure для JavaScript можно установить с помощью команды установки npm. Для проверки подлинности с помощью Microsoft Entra ID также требуется пакет @azure/identity.
npm install @azure/batch @azure/identity
Эта команда устанавливает последнюю версию пакета SDK пакетная служба Azure для JavaScript вместе с библиотекой Azure Identity.
Подсказка
В приложении Azure Functions можно перейти на вкладку настроек функций Azure и вызвать "Консоль Kudu", чтобы запустить команды npm install. В этом случае необходимо установить пакет SDK пакетная служба Azure для JavaScript.
Шаг 2. Создание учетной записи пакетная служба Azure
Его можно создать на портале Azure или из командной строки ( PowerShell /Azure CLI).
Ниже приведены команды для создания одного через Azure CLI.
Создайте группу ресурсов, пропустите этот шаг, если у вас уже есть та, в которой вы хотите создать учетную запись Batch.
az group create -n "<resource-group-name>" -l "<location>"
Затем создайте учетную запись пакетная служба Azure.
az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"
Вместо использования ключей доступа учетной записи этот пример выполняет аутентификацию через Microsoft Entra ID с помощью DefaultAzureCredential. Убедитесь, что удостоверению, от имени которого выполняется код (учетной записи разработчика, управляемому удостоверению или субъекту-службе), назначена соответствующая роль Azure RBAC для учетной записи Batch, например пакетная служба Azure Data Contributor или пакетная служба Azure Data Reader. Дополнительные сведения см. в разделе Проверка подлинности решений службы Batch с помощью Microsoft Entra ID.
При локальном запуске DefaultAzureCredential может получать учетные данные из Azure CLI (az login), Azure PowerShell, Visual Studio Code или переменных среды. В средах, размещенных в Azure, таких как Функции Azure или виртуальные машины Azure, можно использовать управляемую идентичность.
Шаг 3. Создание клиента службы пакетная служба Azure
Следующий фрагмент кода импортирует модули @azure/batch и @azure/identity, а затем создает BatchClient с помощью DefaultAzureCredential.
// Initializing Azure Batch variables
import { DefaultAzureCredential } from "@azure/identity";
import { BatchClient } from "@azure/batch";
// Replace value below with your Batch account URL
const batchEndpoint = '<batch-account-url>';
const credentials = new DefaultAzureCredential();
const batchClient = new BatchClient(batchEndpoint, credentials);
URI пакетная служба Azure можно найти на вкладке "Обзор" портала Azure. Он имеет формат:
https://accountname.location.batch.azure.com
См. снимок экрана:
Шаг 4. Создание пула пакетная служба Azure
Пул пакетная служба Azure состоит из нескольких виртуальных машин (также называемых узлами пакетной службы). служба пакетная служба Azure развертывает задачи на этих узлах и управляет ими. Вы можете определить следующие параметры конфигурации для пула.
- Тип образа виртуальной машины
- Размер узлов виртуальной машины
- Количество узлов виртуальной машины
Подсказка
Размер и количество узлов виртуальной машины в значительной степени зависят от количества задач, которые необходимо выполнять параллельно, а также самой задачи. Мы рекомендуем протестировать, чтобы определить идеальное число и размер.
В следующем фрагменте кода создаются объекты параметров конфигурации.
// 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";
Подсказка
Для списка доступных для пакетная служба Azure образов виртуальных машин Linux и их идентификаторов SKU см. Список образов виртуальных машин.
После определения конфигурации пула можно создать пул пакетная служба Azure. Команда пула пакетной обработки создает узлы виртуальных машин Azure и подготавливает их для выполнения задач. Каждый пул должен иметь уникальный идентификатор для ссылки в последующих шагах.
В следующем фрагменте кода создается пул пакетная служба Azure.
// 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
try {
await batchClient.createPool(poolConfig);
} catch (error) {
console.log(error);
}
Вы можете проверить состояние созданного пула и убедиться, что оно "активно" перед отправкой задачи в этот пул.
try {
const cloudPool = await batchClient.getPool(poolId);
if (cloudPool.state === "active") {
console.log("Pool is active");
}
} catch (error) {
if (error.statusCode === 404) {
console.log("Pool not found yet returned 404...");
} else {
console.log("Error occurred while retrieving pool data");
}
}
Ниже приведен пример объекта результата, возвращаемого функцией 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' }}
Шаг 4. Отправка задания пакетная служба Azure
Задание пакетная служба Azure — это логическая группа аналогичных задач. В нашем сценарии это "Обработка csv-файла в JSON". Каждая задача здесь может обрабатывать CSV-файлы, присутствующих в каждом контейнере служба хранилища Azure.
Эти задачи будут выполняться параллельно и развертываются на нескольких узлах, управляемых службой пакетная служба Azure.
Подсказка
Свойство taskSlotsPerNode позволяет указать максимальное количество задач, которые могут выполняться одновременно на одном узле.
Задача подготовки
Созданные узлы виртуальных машин являются пустыми узлами Ubuntu. Часто необходимо установить набор программ в качестве необходимых компонентов. Как правило, для узлов Linux можно использовать скрипт оболочки, который устанавливает предварительные требования перед выполнением фактических задач. Однако это может быть любой программируемый исполняемый файл.
Скрипт shell в этом примере устанавливает Python-pip и SDK служба хранилища Azure Blob для Python.
Скрипт можно отправить в учетную запись служба хранилища Azure и создать URI SAS для доступа к скрипту. Этот процесс также можно автоматизировать с помощью пакета SDK для JavaScript служба хранилища Azure.
Подсказка
Задача подготовки задания выполняется только на узлах виртуальной машины, где должна выполняться конкретная задача. Если необходимо установить необходимые компоненты на всех узлах независимо от задач, выполняемых на нем, можно использовать свойство startTask при добавлении пула. Для справки можно использовать следующее определение задачи подготовки.
Задача подготовки указывается во время отправки задания пакетная служба Azure. Ниже приведены некоторые настраиваемые параметры задачи подготовки:
- Идентификатор: уникальный идентификатор задачи подготовки
- commandLine: командная строка для выполнения задачи
-
resourceFiles: массив объектов, которые предоставляют сведения о файлах, которые необходимо скачать для выполнения этой задачи. Ниже приведены его параметры
- httpUrl: URL-адрес файла для скачивания
- filePath: локальный путь для скачивания и сохранения файла
- fileMode: применимо только для узлов Linux, fileMode находится в восьмеричном формате со значением по умолчанию 0770
- waitForSuccess: если задано значение true, задача не выполняется при сбоях задач подготовки.
- runElevated: задайте значение true, если для выполнения задачи требуются повышенные привилегии.
В следующем фрагменте кода показан пример конфигурации скрипта задачи подготовки:
const jobPrepTaskConfig = {
id: "installprereq",
commandLine: "sudo sh startup_prereq.sh > startup.log",
resourceFiles: [{ httpUrl: 'Blob sh url', filePath: 'startup_prereq.sh' }],
waitForSuccess: true,
userIdentity: { autoUser: { elevationLevel: "admin", scope: "pool" } }
};
Если нет необходимых предварительных условий для установки и выполнения ваших задач, можно пропустить подготовительные работы. В следующем коде создается задание с отображаемым именем "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
try {
await batchClient.createJob(jobConfig);
} catch (error) {
console.log("An error occurred while creating the job...");
console.log(error);
}
Шаг 5. Отправка пакетная служба Azure задач для задания
Теперь, когда создано задание CSV-файла процесса, давайте создадим задачи для этого задания. Предположим, что у нас есть четыре контейнера, необходимо создать четыре задачи, по одному для каждого контейнера.
Если мы рассмотрим скрипт Python, он принимает два параметра:
- имя контейнера: контейнер хранилища для скачивания файлов из
- шаблон: необязательный параметр шаблона имени файла
Если у нас есть четыре контейнера "con1", "con2", "con3", "con4", следующий код показывает отправку четырех задач в Azure пакетное задание "process csv", созданное ранее.
// storing container names in an array
const containerList = ["con1", "con2", "con3", "con4"]; //Replace with list of blob containers within storage account
for (const val of containerList) {
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' }]
};
try {
await batchClient.createTask(jobId, taskConfig);
console.log("Task for container : " + containerName + " submitted successfully");
} catch (error) {
console.log("Error occurred while creating task for container " + containerName + ". Details : " + error);
}
}
Код добавляет несколько задач в пул. И каждая из задач выполняется на узле в пуле виртуальных машин, созданных. Если число задач превышает количество виртуальных машин в пуле или значение свойства taskSlotsPerNode, задачи ожидают, пока узел не станет доступным. Эта оркестрация автоматически обрабатывается пакетная служба Azure.
На портале есть подробные представления о задачах и статусах заданий. Вы также можете использовать список и получать функции в пакете SDK для JavaScript Azure. Сведения приведены в документации по ссылке.
Дальнейшие действия
- Узнайте о рабочем процессе службы Batch и основных ресурсах, таких как пулы, узлы, задания и задачи.
- См. справочник по Batch JavaScript для изучения Batch API.