Краткое руководство. Создание пула пакетной службы и выполнение задания с помощью Python

В этом кратком руководстве показано, как приступить к работе с пакетная служба Azure путем запуска приложения, использующего библиотеки пакетная служба Azure для Python. Приложение Python:

  • Отправляет несколько входных файлов данных в контейнер больших двоичных объектов служба хранилища Azure для обработки задач пакетной службы.
  • Создает пул двух виртуальных машин (виртуальных машин) или вычислительных узлов под управлением ОС Ubuntu 20.04 LTS.
  • Создает задание, а также три задачи, выполняемые на узлах. Каждая задача обрабатывает один из входных файлов с помощью командной строки оболочки Bash.
  • Отображает выходные файлы, возвращаемые задачами.

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

Необходимые компоненты

Выполнить приложение

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

Скачивание или клонирование приложения

  1. Скачайте или клонируйте приложение быстрого запуска Python пакетная служба Azure из GitHub. Используйте следующую команду, чтобы клонировать репозиторий приложения с клиентом Git:

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. Перейдите в папку batch-python-quickstart/src и установите необходимые пакеты с помощью pip.

    pip install -r requirements.txt
    

Укажите сведения о учетной записи

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

Чтобы получить сведения об учетной записи из портал Azure, выполните следующие действия.

  1. На панели поиска Azure найдите и выберите имя учетной записи пакетной службы.
  2. На странице учетной записи пакетной службы выберите "Ключи " в области навигации слева.
  3. На странице "Ключи" скопируйте следующие значения:
  • Учетная запись пакетной службы
  • Конечная точка учетной записи
  • Первичный ключ доступа
  • Имя учетной записи хранения
  • Key1

В скачанном приложении Python измените следующие строки в файле config.py , чтобы указать скопированные значения.

BATCH_ACCOUNT_NAME = '<batch account>'
BATCH_ACCOUNT_KEY = '<primary access key>'
BATCH_ACCOUNT_URL = '<account endpoint>'
STORAGE_ACCOUNT_NAME = '<storage account name>'
STORAGE_ACCOUNT_KEY = '<key1>'

Внимание

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

Запуск приложения и просмотр выходных данных

Запустите приложение, чтобы увидеть рабочий процесс пакетной службы в действии.

python python_quickstart_client.py

Обычное время выполнения составляет примерно три минуты. Начальная настройка узла пула занимает больше всего времени.

Приложение возвращает выходные данные, аналогичные следующему примеру:

Sample start: 11/26/2012 4:02:54 PM

Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [PythonQuickstartPool]...
Creating job [PythonQuickstartJob]...
Adding 3 tasks to job [PythonQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

При запуске вычислительных узлов пула возникает пауза Monitoring all tasks for 'Completed' state, timeout in 00:30:00... . По мере создания задач пакетная служба их выполняет в пуле. Как только первый вычислительный узел доступен, первая задача выполняется на узле. Вы можете отслеживать состояние узла, задачи и задания на странице учетной записи пакетной службы в портал Azure.

После завершения каждой задачи вы увидите выходные данные, аналогичные следующему примеру:

Printing task output...
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard output:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...

Просмотр кода

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

Создание клиентов служб и отправка файлов ресурсов

  1. Приложение создает объект BlobServiceClient для взаимодействия с учетной записью служба хранилища.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. Приложение использует ссылку blob_service_client на создание контейнера в учетной записи служба хранилища и отправку файлов данных в контейнер. Файлы в хранилище определяются как объекты пакетной службы ResourceFile, которые она может впоследствии скачать на вычислительные узлы.

    input_file_paths = [os.path.join(sys.path[0], 'taskdata0.txt'),
                        os.path.join(sys.path[0], 'taskdata1.txt'),
                        os.path.join(sys.path[0], 'taskdata2.txt')]
    
    input_files = [
        upload_file_to_container(blob_service_client, input_container_name, file_path)
        for file_path in input_file_paths]
    
  3. Приложение создает объект BatchServiceClient для создания пулов, заданий и задач в учетной записи пакетной службы и управления ими. Клиент пакетной службы использует проверку подлинности с общим ключом. Пакет также поддерживает проверку подлинности Microsoft Entra.

    credentials = SharedKeyCredentials(config.BATCH_ACCOUNT_NAME,
            config.BATCH_ACCOUNT_KEY)
    
        batch_client = BatchServiceClient(
            credentials,
            batch_url=config.BATCH_ACCOUNT_URL)
    

Создание пула вычислительных узлов

Чтобы создать пул пакетной службы, приложение использует класс PoolAddParameter для задания количества узлов, размера виртуальной машины и конфигурации пула. Следующий объект VirtualMachineConfiguration указывает ImageReference для образа Ubuntu Server 20.04 LTS Azure Marketplace. Пакетная служба поддерживает широкий спектр образов Linux и Windows Server Marketplace, а также поддерживает пользовательские образы виртуальных машин.

POOL_VM_SIZE И POOL_NODE_COUNT определяются константы. Приложение создает пул двух размеров Standard_DS1_v2 узлов. Этот размер обеспечивает хороший баланс производительности и затрат для этого краткого руководства.

Метод pool.add отправляет пул в пакетную службу.

new_pool = batchmodels.PoolAddParameter(
        id=pool_id,
        virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
            image_reference=batchmodels.ImageReference(
                publisher="canonical",
                offer="0001-com-ubuntu-server-focal",
                sku="20_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 20.04"),
        vm_size=config.POOL_VM_SIZE,
        target_dedicated_nodes=config.POOL_NODE_COUNT
    )
    batch_service_client.pool.add(new_pool)

Создание задания пакетной службы

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

Приложение использует класс JobAddParameter для создания задания в пуле. Метод job.add добавляет задание в указанную учетную запись пакетной службы. Изначально у задания нет задач.

job = batchmodels.JobAddParameter(
    id=job_id,
    pool_info=batchmodels.PoolInformation(pool_id=pool_id))

batch_service_client.job.add(job)

Создание задач

В пакетной службе предусмотрено несколько способов для развертывания приложений и скриптов на вычислительных узлах. Это приложение создает список объектов задач с помощью класса TaskAddParameter . Каждая задача обрабатывает входной файл с помощью command_line параметра для указания приложения или скрипта.

Следующий скрипт обрабатывает входные resource_files объекты, выполнив команду оболочки cat Bash для отображения текстовых файлов. Затем приложение использует метод task.add_collection для добавления каждой задачи в задание, в очереди задач для выполнения на вычислительных узлах.

tasks = []

for idx, input_file in enumerate(resource_input_files):
    command = f"/bin/bash -c \"cat {input_file.file_path}\""
    tasks.append(batchmodels.TaskAddParameter(
        id=f'Task{idx}',
        command_line=command,
        resource_files=[input_file]
    )
    )

batch_service_client.task.add_collection(job_id, tasks)

Просмотр выходных данных задачи

Приложение отслеживает состояние задачи, чтобы убедиться в том, что ее выполнение завершено. При успешном выполнении каждой задачи выходные данные команды задачи записываются в файл stdout.txt . Затем приложение отображает файл stdout.txt для каждой завершенной задачи.

tasks = batch_service_client.task.list(job_id)

for task in tasks:

    node_id = batch_service_client.task.get(job_id, task.id).node_info.node_id
    print(f"Task: {task.id}")
    print(f"Node: {node_id}")

    stream = batch_service_client.file.get_from_task(
        job_id, task.id, config.STANDARD_OUT_FILE_NAME)

    file_text = _read_stream_as_string(
        stream,
        text_encoding)

    if text_encoding is None:
        text_encoding = DEFAULT_ENCODING

    sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = text_encoding)
    sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = text_encoding)

    print("Standard output:")
    print(file_text)

Очистка ресурсов

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

Если вам больше не нужны ресурсы пакетной службы, можно удалить группу ресурсов, содержащую их. В портал Azure выберите "Удалить группу ресурсов" в верхней части страницы группы ресурсов. На экране "Удалить группу ресурсов" введите имя группы ресурсов и нажмите кнопку "Удалить".

Следующие шаги

В этом кратком руководстве вы запустили приложение, использующее API Python пакетной службы для создания пула пакетной службы, узлов, заданий и задач. Задание отправляет файлы ресурсов в контейнер хранилища, выполняет задачи на узлах и отображает выходные данные узлов.

Теперь, когда вы понимаете основные понятия пакетной службы, вы готовы использовать пакетную службу с более реалистичными, большими масштабируемыми рабочими нагрузками. Чтобы узнать больше о пакетная служба Azure и перейти к параллельной рабочей нагрузке с реальным приложением, перейдите к руководству по Пакетной службе Python.