Поделиться через


Начало работы с Batch SDK для JavaScript

Ознакомьтесь с основами создания клиента Azure Batch в JavaScript, используя Azure Batch JavaScript SDK. Пошаговый подход к пониманию сценария пакетного приложения и его настройке с помощью JavaScript.

Предпосылки

В этой статье предполагается, что вы знакомы с JavaScript и знакомы с Linux. Кроме того, предполагается, что у вас настроена учетная запись Azure с правами доступа на создание служб пакетной обработки и услуг хранилища.

Мы рекомендуем ознакомиться с техническим обзором пакетной службы Azure , прежде чем выполнить действия, описанные в этой статье.

Ознакомление со сценарием

Здесь у нас есть простой скрипт, написанный на Python, который скачивает все CSV-файлы из контейнера хранилища BLOB-объектов Azure и преобразует их в JSON. Для параллельной обработки нескольких контейнеров учетных записей хранения можно развернуть скрипт в качестве задания пакетной службы Azure.

Архитектура пакетной службы Azure

На следующей схеме показано, как масштабировать скрипт Python с помощью пакетной службы Azure и клиента.

Схема, показывающая архитектуру сценария.

Пример JavaScript развертывает пакетное задание с задачей подготовки (подробно описано далее) и набор задач в зависимости от количества контейнеров в учетной записи хранения. Скрипты можно скачать из репозитория GitHub.

Подсказка

Пример JavaScript в указанной ссылке не содержит конкретный код для развертывания в качестве приложения-функции Azure. Инструкции по его созданию см. по следующим ссылкам.

Создайте приложение

Теперь давайте следуйте этапу процесса, чтобы создать клиент JavaScript:

Шаг 1. Установка пакета SDK пакетной службы Azure

Вы можете установить Azure Batch SDK для JavaScript с помощью команды npm install.

npm install @azure/batch

Эта команда устанавливает последнюю версию пакета SDK JavaScript для пакетной службы Azure.

Подсказка

В приложении-функции Azure можно перейти в консоль Kudu на вкладке "Параметры" функции Azure, чтобы запустить команды установки npm. В этом случае для установки 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>"

Каждая учетная запись пакетной службы имеет соответствующие ключи доступа. Эти ключи необходимы для создания дополнительных ресурсов в учетной записи пакетной службы Azure. Хорошей практикой для производственной среды является использование Azure Key Vault для хранения этих ключей. Затем можно создать сервисную учетную запись для приложения. С помощью этого субъекта-службы приложение может создать токен OAuth для доступа к ключам в хранилище ключей.

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

Скопируйте и сохраните ключ, который будет использоваться в последующих шагах.

Шаг 3. Создание клиента пакетной службы Azure

Следующий фрагмент кода сначала импортирует модуль JavaScript пакетной службы Azure, а затем создает клиент пакетной службы. Сначала необходимо создать объект SharedKeyCredentials с ключом учетной записи Batch, скопированным на предыдущем шаге.

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

URI пакетной службы Azure можно найти на вкладке "Обзор" портала Azure. Он имеет формат:

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

См. снимок экрана:

URI для пакетной обработки Azure

Шаг 4. Создание пула Azure Batch

Пул пакетной службы 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";

Подсказка

Список образов виртуальных машин Linux, доступных для пакетной службы Azure и идентификаторов SKU, см. в списке образов виртуальных машин.

После определения конфигурации пула можно создать пул Azure Batch. Команда пула пакетной службы создает узлы виртуальной машины Azure и подготавливает их к подготовке к выполнению задач. Каждый пул должен иметь уникальный идентификатор для ссылки в последующих шагах.

В следующем фрагменте кода создается пул 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)};
});

Вы можете проверить состояние созданного пула и убедиться, что оно "активно" перед отправкой задачи в этот пул.

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

Ниже приведен пример объекта результата, возвращаемого функцией 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 Batch

Пакетное задание Azure — это логическая группа аналогичных задач. В нашем сценарии это "Обработка csv-файла в JSON". Каждая задача здесь может обрабатывать CSV-файлы, присутствующих в каждом контейнере службы хранилища Azure.

Эти задачи будут выполняться параллельно и развертываются на нескольких узлах, управляемых пакетной службой Azure.

Подсказка

Свойство taskSlotsPerNode можно использовать для указания максимального количества задач, которые могут выполняться одновременно на одном узле.

Задача подготовки

Созданные узлы виртуальных машин являются пустыми узлами Ubuntu. Часто необходимо установить набор программ в качестве необходимых компонентов. Как правило, для узлов Linux можно использовать скрипт оболочки, который устанавливает предварительные требования перед выполнением фактических задач. Однако это может быть любой программируемый исполняемый файл.

Скрипт оболочки в этом примере устанавливает Python-pip и пакет SDK BLOB-объектов службы хранилища Azure для Python.

Скрипт можно отправить в учетную запись хранения Azure и создать URI SAS для доступа к скрипту. Этот процесс также можно автоматизировать с помощью пакета SDK JavaScript службы хранилища Azure.

Подсказка

Задача подготовки задания выполняется только на узлах виртуальной машины, где должна выполняться конкретная задача. Если необходимо установить необходимые компоненты на всех узлах независимо от задач, выполняемых на нем, можно использовать свойство startTask при добавлении пула. Для справки можно использовать следующее определение задачи подготовки.

Задача подготовки указывается во время отправки пакетного задания Azure. Ниже приведены некоторые настраиваемые параметры задачи подготовки:

  • ID (идентификатор): уникальный идентификатор задачи подготовки
  • commandLine: командная строка для выполнения задачи исполняемого файла
  • resourceFiles: массив объектов, которые предоставляют сведения о файлах, которые необходимо скачать для выполнения этой задачи. Ниже приведены его параметры
    • httpUrl: URL-адрес файла для скачивания
    • filePath: локальный путь для скачивания и сохранения файла
    • fileMode: применимо только для узлов Linux, fileMode находится в восьмеричном формате со значением по умолчанию 0770
  • waitForSuccess: если задано значение true, задача не выполняется при сбоях задач подготовки.
  • runElevated: задайте значение true, если для выполнения задачи требуются повышенные привилегии.

В следующем фрагменте кода показан пример конфигурации скрипта задачи подготовки:

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

Если нет необходимых предварительных условий для установки и выполнения ваших задач, можно пропустить подготовительные работы. В следующем коде создается задание с отображаемым именем "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);
        }
    }
);

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

Код добавляет несколько задач в пул. И каждая из задач выполняется на узле в пуле виртуальных машин, созданных. Если число задач превышает количество виртуальных машин в пуле или значение свойства taskSlotsPerNode, задачи ожидают, пока узел не станет доступным. Эта оркестрация обрабатывается пакетной службой Azure автоматически.

На портале есть подробные представления о задачах и статусах заданий. Вы также можете использовать функции list и get в JavaScript SDK для Azure. Сведения приведены в документации по ссылке.

Дальнейшие действия