你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
应用程序包可以简化 Azure Batch 解决方案中的代码,并更轻松地管理任务运行的应用程序。 使用应用程序包,可以上传和管理任务运行的多个版本的应用程序,包括其支持文件。 然后,可以将其中一个或多个应用程序自动部署到池中的计算节点。
用于创建和管理应用程序包的 API 是 Batch Management .NET 库的一部分。 用于在计算节点上安装应用程序包的 API 是 Batch .NET 库的一部分。 与之相当的功能在其他编程语言的可用 Batch API 中也存在。
本文介绍如何在 Azure 门户中上传和管理应用程序包。 它还演示如何使用 Batch .NET 库在池的计算节点上安装它们。
应用程序包要求
若要使用应用程序包,需要 将 Azure 存储帐户链接到 Batch 帐户。
Batch 帐户中的应用程序和应用程序包数以及应用程序包大小上限存在限制。 有关详细信息,请参阅 Batch 服务的配额和限制。
注释
在 2017 年 7 月 5 日之前创建的批处理池不支持应用程序包(除非这些池是在 2016 年 3 月 10 日之后使用云服务配置创建的)。 此处介绍的应用程序包功能取代了早期版本的服务中提供的 Batch 应用功能。
了解应用程序和应用程序包
在 Azure Batch 中,应用程序是指一组已创建版本的二进制文件,这些文件可自动下载到池中的计算节点。 应用程序包含一个或多个 应用程序包,这些包表示应用程序的不同版本。
每个 应用程序包 都是一个 .zip 文件,其中包含应用程序二进制文件和任何支持文件。 仅支持 .zip 格式。
可以在池或任务级别指定应用程序包。
池应用程序包 部署到池中的每个节点。 当节点加入池以及重新启动或重置映像时,就会部署应用程序。
池应用程序包适合于当池中的所有节点都运行作业任务时使用。 可以指定要在创建池时部署的一个或多个应用程序包。 还可以添加或更新现有池的包。 若要将新包安装到现有池,必须重启其节点。
在运行任务的命令行之前,任务应用程序包只部署到计划要运行任务的计算节点。 如果指定的应用程序包和版本已在节点上,则不会重新部署它,并且使用现有包。
任务应用程序包在共享池环境中非常有用,其中不同的作业在一个池上运行,并且作业完成后不会删除该池。 如果作业的任务少于池中的节点,则任务应用程序包可以最大程度地减少数据传输,因为应用程序仅部署到运行任务的节点。
其他可以从任务应用程序包中受益的场景包括那些运行大型应用程序但仅执行少量任务的作业。 例如,任务应用程序对于重量级预处理阶段或合并任务可能很有用。
使用应用程序包时,池的启动任务无需指定要在节点上安装的多个单独资源文件的详细列表。 无需在 Azure 存储或节点上手动管理多个版本的应用程序文件。 无需担心生成 SAS URL 即可访问 Azure 存储帐户中的文件。 Batch 在后台使用 Azure 存储来存储应用程序包并将其部署到计算节点。
注释
启动任务的总大小必须小于或等于 32,768 个字符,包括资源文件和环境变量。 如果启动任务超出此限制,则使用应用程序包是另一个选项。 还可以创建包含资源文件的 .zip 文件,将文件作为 Blob 上传到 Azure 存储,然后从启动任务的命令行解压缩该文件。
上传和管理应用程序
可以使用 Azure 门户 或 Batch 管理 API 来管理 Batch 帐户中的应用程序包。 以下部分介绍如何链接存储帐户,了解如何在 Azure 门户中添加和管理应用程序和应用程序包。
注释
虽然可以在 ARM 模板的 Microsoft.Batch/batchAccounts 资源中定义应用程序值,但目前无法使用 ARM 模板上传要在 Batch 帐户中使用的应用程序包。 必须按照 “添加新应用程序”中所述将它们上传到链接的存储帐户。
链接存储帐户
若要使用应用程序包,必须将 Azure 存储帐户 链接到 Batch 帐户。 Batch 服务使用关联的存储帐户存储应用程序包。 理想情况下,应创建专用于 Batch 帐户的存储帐户。
如果尚未配置存储帐户,Azure 门户会在首次从 Batch 帐户的左侧导航菜单中选择 “应用程序 ”时显示警告。 需要将存储帐户链接到 Batch 帐户:
- 选择警告窗口,显示消息“没有为此批处理帐户配置的存储帐户”。
- 然后在下一页上选择 “存储帐户设置...” 。
- 选择“存储帐户信息”部分中的“选择存储帐户”链接。
- 在“ 选择存储帐户 ”窗格的列表中选择要用于此批处理帐户的存储帐户。
- 然后选择页面左上角的 “保存 ”。
链接两个帐户后,Batch 可以自动将存储在链接存储帐户中的包部署到计算节点。
重要
不能将应用程序包与配置有 防火墙规则 的 Azure 存储帐户或分层 命名空间 设置为 “已启用”一起使用。
Batch 服务使用 Azure 存储将应用程序包存储为块 blob。 块 blob 数据正常收费,且每个包的大小不能超过最大块 blob 大小。 有关详细信息,请参阅 Blob 存储可伸缩性和性能目标。 若要最大程度地降低成本,请务必考虑应用程序包的大小和数量,并定期删除已弃用的包。
添加新应用程序
若要创建新应用程序,请添加应用程序包并指定唯一的应用程序 ID。
在 Batch 帐户中,从左侧导航菜单中选择 “应用程序 ”,然后选择“ 添加”。
输入以下信息:
- 应用程序 ID:新应用程序的 ID。
- 版本“:要上传的应用程序包的版本。
- 应用程序包:包含应用程序二进制文件和运行应用程序所需的支持文件 .zip 文件。
应用程序 ID 和 版本 的输入必须满足以下要求:
- 在 Windows 节点上,ID 可以包含字母数字字符、连字符和下划线的任意组合。 在 Linux 节点上,仅允许使用字母数字字符和下划线。
- 不能包含超过 64 个字符。
- 在 Batch 帐户内必须唯一。
- ID 保留大小写且不区分大小写。
准备就绪后,请选择“提交”。 将 .zip 文件上传到 Azure 存储帐户后,门户会显示通知。 此过程可能需要一些时间,具体取决于要上传的文件的大小以及网络连接的速度。
查看当前应用程序
若要查看 Batch 帐户中的应用程序,请选择左侧导航菜单中 的应用程序 。
选择此菜单选项将打开 “应用程序” 窗口。 此窗口显示帐户中每个应用程序的 ID 以及以下属性:
- 包:与此应用程序关联的版本数。
- 默认版本:如果适用,则部署应用程序时未指定任何版本时安装的应用程序版本。
- 允许更新:指定是否允许包更新和删除。
若要查看计算节点上应用程序包 的文件结构 ,请在 Azure 门户中导航到 Batch 帐户。 选择 池。 然后选择包含计算节点的池。 选择安装应用程序包的计算节点并打开 应用程序 文件夹。
查看应用程序详细信息
若要查看应用程序的详细信息,请在 “应用程序” 窗口中将其选中。 可以通过在左侧导航菜单中选择 “设置” 来配置应用程序。
- 允许更新:指示是否可以 更新或删除应用程序包。 默认值为“是”。 如果设置为 “否”,则无法更新或删除现有应用程序包,但仍然可以添加新的应用程序包版本。
- 默认版本:如果未指定版本,则部署应用程序时要使用的默认应用程序包。
- 显示名称:Batch 解决方案在显示有关应用程序的信息时可以使用的友好名称。 例如,此名称可以在通过 Batch 提供给客户的服务的 UI 中使用。
添加新的应用程序包
若要为现有应用程序添加应用程序包版本,请在 Batch 帐户的“ 应用程序 ”页上选择该应用程序。 然后选择“添加”。
与新应用程序一样,指定新包 的版本 ,在 应用程序包 字段中上传 .zip 文件,然后选择“ 提交”。
更新或删除应用程序包
若要更新或删除现有应用程序包,请在 Batch 帐户的“ 应用程序 ”页上选择该应用程序。 选择要修改的应用程序包行中的省略号。 然后选择要执行的操作。
如果选择 “更新”,则可以上传新的 .zip 文件。 此文件替换了您为该版本上传的先前的 .zip 文件。
如果选择 “删除”,系统会提示确认删除该版本。 选择 “确定”后,Batch 会从 Azure 存储帐户中删除 .zip 文件。 如果删除应用程序的默认版本,则会删除该应用程序的默认 版本 设置。
在计算节点上安装应用程序
你已了解如何在 Azure 门户中管理应用程序包。 现在,可以了解如何将其部署到计算节点,并使用 Batch 任务运行它们。
安装池应用程序包
若要在池中的所有计算节点上安装应用程序包,请为池指定一个或多个应用程序包引用。 为池指定的应用程序包安装在联接池的每个计算节点上,以及重新启动或重新映像的任何节点上。
在 Batch .NET 中,在创建新池或使用现有池时指定一个或多个 CloudPool.ApplicationPackageReferences 。 ApplicationPackageReference 类指定要在池的计算节点上安装的应用程序 ID 和版本。
// Create the unbound CloudPool
CloudPool myCloudPool =
batchClient.PoolOperations.CreatePool(
poolId: "myPool",
targetDedicatedComputeNodes: 1,
virtualMachineSize: "standard_d1_v2",
VirtualMachineConfiguration: new VirtualMachineConfiguration(
imageReference: new ImageReference(
publisher: "MicrosoftWindowsServer",
offer: "WindowsServer",
sku: "2019-datacenter-core",
version: "latest"),
nodeAgentSkuId: "batch.node.windows amd64");
// Specify the application and version to install on the compute nodes
myCloudPool.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
new ApplicationPackageReference {
ApplicationId = "litware",
Version = "1.1001.2b" }
};
// Commit the pool so that it's created in the Batch service. As the nodes join
// the pool, the specified application package is installed on each.
await myCloudPool.CommitAsync();
重要
如果应用程序包部署失败,Batch 服务会将节点标记为 不可用 ,并且不会计划在该节点上执行任何任务。 如果发生这种情况,请重启节点以恢复包部署。 重启节点还会在节点上重新启用任务调度。
安装任务应用程序包
类似于池,可以为任务指定应用程序包引用。 当任务计划在节点上运行时,将在任务命令行运行之前下载并提取包。 如果节点上已安装指定的包和版本,则不会下载该包,并且使用了现有包。
若要安装任务应用程序包,请配置任务的 CloudTask.ApplicationPackageReferences 属性:
CloudTask task =
new CloudTask(
"litwaretask001",
"cmd /c %AZ_BATCH_APP_PACKAGE_LITWARE%\\litware.exe -args -here");
task.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
new ApplicationPackageReference
{
ApplicationId = "litware",
Version = "1.1001.2b"
}
};
执行已安装的应用程序
为池或任务指定的包下载并解压缩到节点的 AZ_BATCH_ROOT_DIR
中的命名目录。 Batch 还会创建一个环境变量,其中包含命名目录的路径。 在引用节点上的应用程序时,任务命令行使用此环境变量。
在 Windows 节点上,该变量采用以下格式:
Windows:
AZ_BATCH_APP_PACKAGE_APPLICATIONID#version
在 Linux 节点上,格式略有不同。 句点(.)、连字符(-)和数字符号(#)在环境变量中被替换为下划线。 此外,请保留应用程序 ID 的大小写。 例如:
Linux:
AZ_BATCH_APP_PACKAGE_applicationid_version
APPLICATIONID
以及 version
对应于为部署指定的应用程序和包版本的值。 例如,如果指定应在 Windows 节点上安装应用程序 混合器 版本 2.7,则任务命令行将使用此环境变量来访问其文件:
Windows:
AZ_BATCH_APP_PACKAGE_BLENDER#2.7
在 Linux 节点上,以此格式指定环境变量。 将句点 (.)、连字符 (-) 和数字符号 (#) 平展为下划线,并保留应用程序 ID 的大小写:
Linux:
AZ_BATCH_APP_PACKAGE_blender_2_7
上传应用程序包时,可以指定要部署到计算节点的默认版本。 如果为应用程序指定了默认版本,可以在引用应用程序时省略版本后缀。 可以在 Azure 门户中的“ 应用程序” 窗口中指定默认应用程序版本,如 “上传和管理应用程序”中所示。
例如,如果将“2.7”设置为应用程序 混合器的默认版本,并且任务引用以下环境变量,则 Windows 节点使用版本 2.7:
AZ_BATCH_APP_PACKAGE_BLENDER
以下代码片段显示了启动 blender 应用程序的默认版本的示例任务命令行:
string taskId = "blendertask01";
string commandLine =
@"cmd /c %AZ_BATCH_APP_PACKAGE_BLENDER%\blender.exe -args -here";
CloudTask blenderTask = new CloudTask(taskId, commandLine);
小窍门
有关计算节点环境设置的详细信息,请参阅 任务的环境设置。
更新池的应用程序包
如果现有池已配置了应用程序包,则可以为池指定一个新包。 这意味着:
- Batch 服务在加入池的所有新节点上以及重新启动或重新映像的任何现有节点上安装新指定的包。
- 更新包引用时已在池中的计算节点不会自动安装新的应用程序包。 必须重新启动或重新映像这些计算节点才能接收新包。
- 部署新包时,创建的环境变量反映新的应用程序包引用。
在此示例中,现有池已将 blender 应用程序的 2.7 版配置为其 CloudPool.ApplicationPackageReferences 之一。 若要将池的节点更新到版本 2.76b,请指定一个包含新版本的ApplicationPackageReference,并提交更改。
string newVersion = "2.76b";
CloudPool boundPool = await batchClient.PoolOperations.GetPoolAsync("myPool");
boundPool.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
new ApplicationPackageReference {
ApplicationId = "blender",
Version = newVersion }
};
await boundPool.CommitAsync();
配置新版本后,Batch 服务会将版本 2.76b 安装到加入池的任何新节点。 若要在池中的节点上安装 2.76b,请重新启动或重新映像它们。 重新启动的节点会保留以前包部署中的文件。
列出 Batch 帐户中的应用程序
可以使用 ApplicationOperations.ListApplicationSummaries 方法在 Batch 帐户中列出应用程序及其包。
// List the applications and their application packages in the Batch account.
List<ApplicationSummary> applications = await batchClient.ApplicationOperations.ListApplicationSummaries().ToListAsync();
foreach (ApplicationSummary app in applications)
{
Console.WriteLine("ID: {0} | Display Name: {1}", app.Id, app.DisplayName);
foreach (string version in app.Versions)
{
Console.WriteLine(" {0}", version);
}
}
后续步骤
- Batch REST API 还提供使用应用程序包的支持。 例如,请参阅 applicationPackageReferences 元素,了解如何指定要安装的包,以及请参阅 Applications,了解如何获取应用程序信息。
- 了解如何 使用 Batch Management .NET 以编程方式管理 Azure Batch 帐户和配额。 Batch Management .NET 库可以为 Batch 应用程序或服务启用帐户创建和删除功能。