快速入门:使用 Python 创建 Batch 池并运行作业

本快速入门通过运行一个使用适用于 Python 的 Azure Batch 库的应用,展示了如何开始使用 Azure Batch。 该 Python 应用具有以下功能:

  • 将多个输入数据文件上传到 Azure 存储 Blob 容器,以供用于 Batch 任务处理。
  • 创建包含两个虚拟机 (VM) 或计算节点(均运行 Ubuntu 20.04 LTS OS)的池。
  • 创建一个作业和三个任务,它们需要在节点上运行。 每个任务都使用 Bash shell 命令行来处理一个输入文件。
  • 显示各个任务返回的输出文件。

完成本快速入门后,你将了解 Batch 服务的关键概念,并准备好将 Batch 用于更现实、更大规模的工作负载。

先决条件

运行应用

为了完成本快速入门,请下载或克隆 Python 应用、提供帐户值、运行该应用并验证输出内容。

下载或克隆该应用

  1. 从 GitHub 下载或克隆 Azure Batch Python 快速入门应用。 若要使用 Git 客户端克隆应用存储库,请使用以下命令:

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. 切换到“batch-python-quickstart/src”文件夹,使用 pip 安装所需的包。

    pip install -r requirements.txt
    

提供帐户信息

Python 应用需要使用 Batch 和存储帐户名称、帐户密钥值以及 Batch 帐户终结点。 你可以通过 Azure 门户、Azure API 或命令行工具获取这些信息。

若要从 Azure 门户获取帐户信息,请执行以下操作:

  1. 在 Azure 搜索栏中,搜索并选择你的 Batch 帐户名称。
  2. 在 Batch 帐户页面上,从左侧导航栏中选择“密钥”。
  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>'

重要

在实际使用时,不建议在应用源代码中公开帐户密钥。 正确的做法是限制对这些凭据的访问权限,通过使用变量或配置文件来在代码中引用它们。 最好是将 Batch 和存储帐户密钥存储在 Azure 密钥保管库中。

运行该应用并查看输出内容

请运行该应用,以查看 Batch 工作流的运行情况。

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... 出现暂停。 创建任务后,Batch 会将要在池中运行的任务排队。 在第一个计算节点可用后,第一个任务将在该节点上运行。 你可以从 Azure 门户中的 Batch 帐户页面监视节点、任务和作业状态。

每个任务完成后,都会显示类似于以下示例的输出:

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

查看代码

请查看代码,以了解 Azure Batch Python 快速入门中的步骤。

创建服务客户端并上传资源文件

  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 引用在存储帐户中创建容器,然后将数据文件上传到该容器。 存储中的文件定义为 Batch ResourceFile 对象,Batch 随后可以将这些对象下载到计算节点。

    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 对象,以便在 Batch 帐户中创建和管理池、作业和任务。 该 Batch 客户端将使用共享密钥身份验证。 Batch 还支持 Microsoft Entra 身份验证。

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

创建计算节点池

为了创建 Batch 池,该应用使用 PoolAddParameter 类来设置节点数、VM 大小和池配置。 下面的 VirtualMachineConfiguration 对象指定了对 Ubuntu Server 20.04 LTS Azure 市场映像的 ImageReference。 Batch 支持 Azure 市场中的各种 Linux 和 Windows Server 映像以及自定义 VM 映像。

POOL_NODE_COUNTPOOL_VM_SIZE 是定义的常量。 此示例创建的池包含 2 个大小为 Standard_DS1_v2 的节点。 就此快速入门而言,此节点大小在性能与成本之间达成了很好的平衡。

pool.add 方法将池提交到 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)

创建 Batch 作业

Batch 作业是对一个或多个任务进行逻辑分组。 该作业包含这些任务的公用设置,例如优先级以及运行任务的池。

该应用使用 JobAddParameter 类在池中创建作业。 job.add 方法会将作业添加到指定的 Batch 帐户。 作业一开始没有任务。

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

batch_service_client.job.add(job)

创建任务

Batch 提供了多种将应用和脚本部署到计算节点的方式。 此应用使用 TaskAddParameter 类创建了任务对象的列表。 每个任务都将使用 command_line 参数来指定应用或脚本,从而处理输入文件。

以下脚本将通过运行 Bash shell resource_files 命令来显示文本文件,从而处理输入 cat 对象。 然后,该应用使用 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)

清理资源

应用自动删除所创建的存储容器,并允许你选择是否删除 Batch 池和作业。 池和节点会在节点运行时产生费用,即使它们未运行作业也是如此。 不再需要相应池时,请将其删除。

不再需要 Batch 资源时,可以删除包含这些资源的资源组。 在 Azure 门户,选择资源组页面顶部的“删除资源组”。 在“删除资源组”屏幕上,输入资源组名称,然后选择“删除”。

后续步骤

在本快速入门中,你运行了一个应用,该应用使用了 Batch Python API 来创建 Batch 池、节点、作业和任务。 作业将资源文件上传到存储容器,在节点上运行任务,并显示来自节点的输出。

现在你已经了解了 Batch 服务的关键概念,可以将 Batch 用于更现实、更大规模的工作负载了。 若要详细了解 Azure Batch 并使用实际的应用程序来演练并行工作负载,请继续学习 Batch Python 教程。