Inicio rápido: usar Python para crear un grupo de Batch y ejecutar un trabajo

Este inicio rápido muestra cómo comenzar con Azure Batch mediante la ejecución de una aplicación que usa las bibliotecas de Azure Batch para Python. La aplicación de Python:

  • Carga varios archivos de datos de entrada en un contenedor de blobs de Azure Storage para usarlos para el procesamiento de tareas de Batch.
  • Crea un grupo de dos máquinas virtuales (VM) o nodos de proceso que ejecutan el sistema operativo Ubuntu 20.04 LTS.
  • Crea un trabajo y tres tareas que se ejecutan en los nodos. Cada tarea procesa uno de los archivos de entrada mediante una línea de comando de shell Bash.
  • Muestra los archivos de salida que devuelven las tareas.

Tras completar este artículo de inicio rápido, comprenderás los conceptos clave del servicio Batch y estarás listo para usar dicho servicio con cargas de trabajo más realistas y a mayor escala.

Requisitos previos

Ejecución de la aplicación

Para completar este inicio rápido, descarga o clona la aplicación de Python, proporciona los valores de tu cuenta, ejecuta la aplicación y verifica el resultado.

Descargar o clonar la aplicación

  1. Descarga o clona la aplicación de Inicio rápido de Python de Azure Batch desde GitHub. Usa el siguiente comando para clonar el repositorio de aplicaciones con un cliente de Git:

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. Cambia a la carpeta batch-python-quickstart/src e instala los paquetes necesarios mediante pip.

    pip install -r requirements.txt
    

Proporciona la información de tu cuenta

La aplicación de Python debe usar los nombres de cuenta de Batch y Storage, los valores de clave de cuenta y el punto de conexión de la cuenta de Batch. Puedes obtener esta información de las herramientas de Azure Portal, API de Azure o de línea de comandos.

Para obtener la información de la cuenta del Azure Portal:

  1. En la barra de Azure Search, busca y selecciona el nombre de la cuenta de Batch.
  2. En la página Cuenta de Batch, selecciona Claves en el panel de navegación izquierdo.
  3. En la página Claves, copia los valores siguientes:
  • Cuenta de Batch
  • Punto de conexión de la cuenta
  • Clave de acceso principal
  • Nombre de cuenta de almacenamiento
  • Key1

En la aplicación de Python descargada, edita las cadenas siguientes en el archivo config.py para proporcionar los valores que copiaste.

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

Importante

No se recomienda exponer las claves de cuenta en el origen de la aplicación para el uso de producción. Debes restringir el acceso a las credenciales y hacer referencia a ellas en tu código mediante el uso de variables o un archivo de configuración. Es mejor almacenar claves de cuenta de Batch y Storage en Azure Key Vault.

Ejecutar la aplicación y ver el resultado

Ejecutar la aplicación para ver el flujo de trabajo de Batch en acción.

python python_quickstart_client.py

El tiempo de ejecución típico es de aproximadamente tres minutos. La configuración inicial del nodo del grupo lleva la mayor parte del tiempo.

La aplicación devuelve un resultado similar al siguiente ejemplo:

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

Hay una pausa en Monitoring all tasks for 'Completed' state, timeout in 00:30:00... mientras se inician los nodos de cómputo del grupo. A medida que se crean las tareas, Batch las pone en cola para que se ejecuten en el grupo. Tan pronto como el primer nodo de cómputo esté disponible, la primera tarea se ejecuta en el nodo. Puedes supervisar el estado del nodo, la tarea y el trabajo desde la página de tu cuenta de Batch en Azure Portal.

Una vez completada cada tarea, verás una salida similar a la del ejemplo siguiente:

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

Revisión del código

Revisa el código para comprender los pasos del Inicio rápido de Azure Batch Python.

Crear clientes de servicio y cargar archivos de recursos

  1. La aplicación crea un objeto BlobServiceClient para interactuar con la cuenta de Storage.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. La aplicación usa la referencia blob_service_client para crear un contenedor en la cuenta de Storage y cargar archivos de datos en el contenedor. Los archivos de almacenamiento se definen como objetos ResourceFile de Batch para que el servicio los descargue después en nodos de proceso.

    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. La aplicación crea un objeto BatchServiceClient para crear y administrar los grupos, los trabajos y las tareas en la cuenta de Batch. El cliente de Batch utiliza autenticación de clave compartida. Batch también admite la autenticación de Microsoft Entra.

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

Creación de un grupo de nodos de proceso

Para crear un grupo de Batch, la aplicación usa la clase PoolAddParameter para establecer la cantidad de nodos, el tamaño de la máquina virtual y la configuración del grupo. El siguiente objeto VirtualMachineConfiguration especifica una ImageReference a una imagen de Ubuntu Server 20.04 LTS Azure Marketplace. Batch admite una amplia gama de imágenes de Linux y Windows Server Marketplace, y también admite imágenes de VM personalizadas.

POOL_NODE_COUNT y POOL_VM_SIZE son constantes definidas. La aplicación crea un grupo de nodos Standard_DS1_v2 de dos tamaños. Este tamaño ofrece un buen equilibrio entre rendimiento y coste para este artículo de inicio rápido.

El método pool.add envía el grupo al servicio Batch.

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)

Creación de un trabajo de Batch

Un trabajo de Batch es una agrupación lógica de una o varias tareas. El trabajo incluye valores comunes para las tareas, como la prioridad y el grupo en el que se ejecutan las tareas.

La aplicación usa la clase JobAddParameter para crear un trabajo en el grupo. El método job.add agrega el trabajo a la cuenta de Batch especificada. Inicialmente, el trabajo no tiene tareas.

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

batch_service_client.job.add(job)

Creación de tareas

Batch proporciona varias formas de implementar aplicaciones y scripts en nodos de proceso. Esta aplicación crea una lista de objetos de tarea mediante la clase TaskAddParameter. Cada tarea procesa un archivo de entrada mediante el uso de un parámetro command_line para especificar una aplicación o secuencia de comandos.

El siguiente script procesa los objetos de entrada resource_files ejecutando el comando de shell Bash cat para mostrar los archivos de texto. A continuación, la aplicación usa el método task.add_collection para agregar cada tarea al trabajo, que pone en cola las tareas para ejecutarse en los nodos de proceso.

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)

Visualización de la salida de la tarea

La aplicación supervisa el estado de la tarea para asegurarse de que completan las tareas. Cuando cada tarea se ejecuta correctamente, la salida del comando de tarea escribe en el archivo stdout.txt . A continuación, la aplicación muestra el archivo stdout.txt para cada tarea completada.

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)

Limpieza de recursos

La aplicación elimina automáticamente el contenedor de almacenamiento que crea y ofrece la opción de eliminar el grupo y el trabajo de Batch. Los grupos y nodos incurren en cargos mientras se ejecutan los nodos, incluso si no ejecutan trabajos. Si ya no necesitas el grupo, elimínalo.

Cuando ya no necesites los recursos de Batch, puedes eliminar el grupo de recursos que los contiene. En Azure Portal, selecciona Eliminar grupo de recursos en la parte superior de la página del grupo de recursos. En la pantalla Eliminar un grupo de recursos, escribe el nombre del grupo de recursos y luego selecciona Eliminar.

Pasos siguientes

En este inicio rápido, ejecutó una aplicación que usa la API de Python de Batch para crear un grupo, nodos, trabajos y tareas de Batch. El trabajo cargó archivos de recursos en un contenedor de almacenamiento, ejecutó tareas en los nodos y mostró la salida de los nodos.

Ahora que conoces los conceptos clave del servicio Batch, ya estás listo para usar Batch con cargas de trabajo más realistas y a mayor escala. Para más información acerca de Azure Batch y examinar una carga de trabajo en paralelo con una aplicación real, dirígete al tutorial de Python de Batch.