你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure Batch CLI 模板和文件传输

Warning

Batch Azure CLI扩展于 2024 年 9 月 30 日停用。 使用命令 az extension remove --name azure-batch-cli-extensions卸载扩展。

通过使用 Batch 扩展Azure CLI,用户无需编写代码即可运行 Batch 作业。

通过Azure CLI创建和使用 JSON 模板文件来创建 Batch 池、作业和任务。 使用 CLI 扩展命令将作业输入文件轻松上传到与 Batch 帐户关联的存储帐户,并下载作业输出文件。

注释

JSON 文件不支持与Azure 资源管理器模板相同的功能。 它们的格式应类似于原始 REST 请求正文。 CLI 扩展不会更改任何现有命令,但它具有类似的模板选项,可添加部分Azure 资源管理器模板功能。 请参阅适用于 Windows、Mac 和 Linux 的 Azure Batch CLI 扩展

概述

Azure CLI的扩展使 Batch 可由非开发人员的用户使用端到端。 仅使用 CLI 命令,可以创建池、上传输入数据、创建作业和关联任务,以及下载生成的输出数据。 无需其他代码。 直接运行 CLI 命令或将其集成到脚本中。

批处理模板基于 JSON 文件的Azure CLI中的现有 Batch 支持,以便在创建池、作业、任务和其他项时指定属性值。 Batch 模板添加以下功能:

  • 可以定义参数。 使用模板时,仅需指定参数值即可创建该项,而其他项属性值则在模板正文中指定。 了解 Batch 和由 Batch 运行的应用程序的用户可以创建模板、指定池、作业和任务属性值。 不太熟悉 Batch 和/或应用程序的用户只需为定义的参数指定值。

  • 作业任务工厂创建与作业关联的一个或多个任务,避免需要创建许多任务定义并显著简化作业提交。

作业通常使用输入数据文件并生成输出数据文件。 默认情况下,存储帐户与每个 Batch 帐户相关联。 可以使用Azure CLI向/从此存储帐户传输文件,无需编码,也无需存储凭据。

例如, ffmpeg 是处理音频和视频文件的常用应用程序。 使用 Azure Batch CLI 扩展,用户可以更轻松地调用 ffmpeg 以将源视频文件转码为不同的分辨率。 此过程可能如下所示:

  • 创建池模板。 创建模板的用户知道如何调用 ffmpeg 应用程序及其要求;它们指定适当的 OS、VM 大小、如何安装 ffmpeg(例如,从应用程序包或使用包管理器),以及其他池属性值。 创建参数以便使用模板时,只需指定池 ID 和 VM 数目。
  • 创建作业模板。 创建模板的用户知道如何调用 ffmpeg 以将源视频转码为不同的分辨率并指定任务命令行;他们还知道有一个包含源视频文件的文件夹,每个输入文件都需要一个任务。
  • 具有一组要转码的视频文件的最终用户首先使用池模板创建池,只指定所需的池 ID 和 VM 数。 然后,他们可以上传源文件进行转码。 然后,可以使用作业模板提交作业,只指定上传的源文件的池 ID 和位置。 已创建 Batch 作业,并为每个输入文件生成一个任务。 最后,可以下载转码的输出文件。

Installation

若要安装 Azure Batch CLI 扩展,请先安装 Azure CLI 2.0,或在 Azure Cloud Shell 中运行Azure CLI

使用以下Azure CLI命令安装最新版本的 Batch 扩展:

az extension add --name azure-batch-cli-extensions

有关 Batch CLI 扩展和其他安装选项的详细信息,请参阅GitHub存储库

若要使用 CLI 扩展功能,需要一个Azure Batch帐户,对于将文件传入和传出存储的命令,需要一个链接的存储帐户。

若要使用Azure CLI登录到 Batch 帐户,请参阅使用 Azure CLI 管理 Batch 资源

模板

Azure Batch 模板在功能和语法方面与 Azure 资源管理器 模板类似。 它们是包含项属性名称和值的 JSON 文件,但添加以下主要概念:

  • 参数:允许在正文节中指定属性值,仅当使用模板时需要提供参数值。 例如,可以将池的完整定义放在正文中,并且只能定义 poolId一个参数;因此,只需提供池 ID 字符串即可创建池。 模板正文可由了解 Batch 的人员和由 Batch 运行的应用程序编写;使用模板时,必须仅提供作者定义参数的值。 这使用户无需任何深入的 Batch 和/或应用程序知识即可使用模板。
  • 变量:允许在一个位置指定简单或复杂的参数值,并在模板正文中的一个或多个位置使用。 变量可以通过一个位置更改属性来简化和减小模板的大小,并使其更易于维护。
  • 更高级别构造:某些更高级别的构造在 Batch API 中尚不可用的模板中可用。 例如,可以使用通用任务定义在为作业创建多个任务的作业模板中定义任务工厂。 这些构造避免需要编写代码来动态创建多个 JSON 文件,例如每个任务一个文件,以及创建脚本文件以通过包管理器安装应用程序。

池模板

池模板支持参数和变量的标准模板功能。 它们还支持 包引用,可以选择使用包管理器将软件复制到池节点。 包管理器和包 ID 在包引用中指定。 通过声明一个或多个包,可以避免创建获取所需包、安装脚本并在每个池节点上运行脚本的脚本。

下面是创建安装了 ffmpeg 的 Linux VM 池的模板示例。 若要使用它,请仅提供池 ID 字符串和池中的 VM 数:

{
    "parameters": {
        "nodeCount": {
            "type": "int",
            "metadata": {
                "description": "The number of pool nodes"
            }
        },
        "poolId": {
            "type": "string",
            "metadata": {
                "description": "The pool ID "
            }
        }
    },
    "pool": {
        "type": "Microsoft.Batch/batchAccounts/pools",
        "apiVersion": "2016-12-01",
        "properties": {
            "id": "[parameters('poolId')]",
            "virtualMachineConfiguration": {
                "imageReference": {
                    "publisher": "Canonical",
                    "offer": "UbuntuServer",
                    "sku": "20.04-LTS",
                    "version": "latest"
                },
                "nodeAgentSKUId": "batch.node.ubuntu 20.04"
            },
            "vmSize": "STANDARD_D3_V2",
            "targetDedicatedNodes": "[parameters('nodeCount')]",
            "enableAutoScale": false,
            "taskSlotsPerNode": 1,
            "packageReferences": [
                {
                    "type": "aptPackage",
                    "id": "ffmpeg"
                }
            ]
        }
    }
}

如果模板文件命名 为pool-ffmpeg.json,则调用模板,如下所示:

az batch pool create --template pool-ffmpeg.json

CLI 会提示你为 poolIdnodeCount 参数提供值。 还可以在 JSON 文件中提供参数。 例如:

{
  "poolId": {
    "value": "mypool"
  },
  "nodeCount": {
    "value": 2
  }
}

如果参数 JSON 文件名为 pool-parameters.json,则按如下方式调用该模板:

az batch pool create --template pool-ffmpeg.json --parameters pool-parameters.json

工作模板

作业模板支持参数和变量的标准模板功能。 他们还支持 任务工厂 构造,该构造从一个任务定义为作业创建多个任务。 支持三种类型的任务工厂:参数扫描、按文件创建任务和任务集合。

下面是一个模板示例,该模板创建一个作业,以便使用 ffmpeg 将 MP4 视频文件转码为两个较低分辨率之一。 它为每个源视频文件创建一个任务。 有关作业输入和输出的文件组的详细信息,请参阅 文件组和文件传输

{
    "parameters": {
        "poolId": {
            "type": "string",
            "metadata": {
                "description": "The name of Azure Batch pool which runs the job"
            }
        },
        "jobId": {
            "type": "string",
            "metadata": {
                "description": "The name of Azure Batch job"
            }
        },
        "resolution": {
            "type": "string",
            "defaultValue": "428x240",
            "allowedValues": [
                "428x240",
                "854x480"
            ],
            "metadata": {
                "description": "Target video resolution"
            }
        }
    },
    "job": {
        "type": "Microsoft.Batch/batchAccounts/jobs",
        "apiVersion": "2016-12-01",
        "properties": {
            "id": "[parameters('jobId')]",
            "constraints": {
                "maxWallClockTime": "PT5H",
                "maxTaskRetryCount": 1
            },
            "poolInfo": {
                "poolId": "[parameters('poolId')]"
            },
            "taskFactory": {
                "type": "taskPerFile",
                "source": {
                    "fileGroup": "ffmpeg-input"
                },
                "repeatTask": {
                    "commandLine": "ffmpeg -i {fileName} -y -s [parameters('resolution')] -strict -2 {fileNameWithoutExtension}_[parameters('resolution')].mp4",
                    "resourceFiles": [
                        {
                            "blobSource": "{url}",
                            "filePath": "{fileName}"
                        }
                    ],
                    "outputFiles": [
                        {
                            "filePattern": "{fileNameWithoutExtension}_[parameters('resolution')].mp4",
                            "destination": {
                                "autoStorage": {
                                    "path": "{fileNameWithoutExtension}_[parameters('resolution')].mp4",
                                    "fileGroup": "ffmpeg-output"
                                }
                            },
                            "uploadOptions": {
                                "uploadCondition": "TaskSuccess"
                            }
                        }
                    ]
                }
            },
            "onAllTasksComplete": "terminatejob"
        }
    }
}

如果模板文件命名 为job-ffmpeg.json,则调用模板,如下所示:

az batch job create --template job-ffmpeg.json

与之前一样,CLI 会提示你提供参数的值。 还可以在 JSON 文件中提供参数。

在 Batch Explorer 中使用模板

可以将 Batch CLI 模板上传到 Batch Explorer 桌面应用程序,以创建 Batch 池或作业。 还可以在 Batch Explorer 库中选择预定义的池和作业模板。

上传模板:

  1. 在 Batch 资源管理器中,选择 >本地模板
  2. 选择或拖放本地池或作业模板。
  3. 选择“ 使用此模板”,然后按照屏幕上的提示进行操作。

文件组和文件传输

大多数作业和任务都需要输入文件并生成输出文件。 通常,输入文件和输出文件会从客户端传输到节点,或从节点传输到客户端。 Azure Batch CLI 扩展提取文件传输,并利用可与每个 Batch 帐户相关联的存储帐户。

文件组等同于在Azure存储帐户中创建的容器。 文件组可能具有子文件夹。

Batch CLI 扩展提供命令,用于将文件从客户端上传到指定的文件组,并将文件从指定的文件组下载到客户端。

az batch file upload --local-path c:\source_videos\*.mp4
    --file-group ffmpeg-input

az batch file download --file-group ffmpeg-output --local-path
    c:\output_lowres_videos

池模板和作业模板允许指定存储在文件组中的文件,以便将其复制到池节点上,或从池节点复制回文件组。 例如,在之前指定的作业模板中,为任务工厂指定文件组 ffmpeg-input 作为复制到节点进行转码的源视频文件的位置。 文件组 ffmpeg-output 是用于存放从运行各任务的节点复制过来的转码输出文件的位置。

总结

模板和文件传输支持当前仅添加到Azure CLI。 目标是将可以使用 Batch 的受众扩展到不需要使用 Batch API 开发代码的用户,例如研究人员和 IT 用户。 无需编写代码,了解 Azure、Batch 以及将由 Batch 运行的应用程序的用户即可创建用于创建池和作业的模板。 借助模板参数,即使对 Batch 和相关应用程序没有深入了解,用户也可以使用这些模板。

试用Azure CLI的 Batch 扩展,并在本文的注释中或通过 Batch 社区存储库向我们提供任何反馈或建议。

后续步骤