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

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

Предварительные условия

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

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

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

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

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

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

Схема, демонстрирующая архитектуру сценария.

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

Совет

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

создание приложения;

Рассмотрим пошаговый процесс создания клиента JavaScript.

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

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

npm install @azure/batch

Эта команда служит для установки последней версии пакета SDK для JavaScript в azure-batch.

Совет

Для запуска команд npm install в приложении-функции Azure перейдите к консоли Kudu на вкладке параметров функций Azure. В данном случае устанавливается пакет SDK пакетной службы Azure для JavaScript.

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

Ее можно создать на портале Azure или с помощью командной строки (PowerShell /Azure CLI).

Ниже перечислены команды для создания учетной записи пакетной службы Azure с помощью Azure CLI.

Создайте группу ресурсов. (Пропустите этот шаг, если у вас уже есть группа, в которой вы хотите создать учетную запись пакетной службы.)

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

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

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

Пул пакетной службы 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. Команда пула пакетной службы создает узлы виртуальных машин 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
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

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

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

Совет

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

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

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

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

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

Совет

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

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

  • Идентификатор. уникальный идентификатор приложения.
  • 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 принимает два параметра:

  • container_name: контейнер хранилища, откуда будут скачиваться файлы.
  • pattern: необязательный параметр шаблона имени файла.

Предположим, у нас есть четыре контейнера 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 обрабатывает автоматически.

Портал содержит подробные представления задач и состояния заданий. Чтобы получить функции в пакете SDK для Azure JavaScript, можно также использовать список. Подробные сведения приведены в документации по ссылке.

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