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

Batch 计算节点上的作业准备和释放任务

Azure Batch 作业在执行其任务之前通常需要进行设置,并在完成任务后进行作业后维护。 例如,可能需要将常见的任务输入数据下载到计算节点,或者在作业完成之后,将任务输出数据上传到 Azure 存储。 可以使用作业准备作业释放任务来执行这些操作。

  • 作业准备任务将在计划运行至少一个任务的所有节点上运行,然后再运行作业的任务。
  • 作业完成后,将在池中运行了作业准备任务的每个节点上运行作业释放任务。

与其他 Batch 任务一样,可以指定在运行作业准备或释放任务时要调用的命令行。 作业准备和释放任务提供熟悉的 Batch 任务功能,例如:

  • 资源文件下载
  • 提升的执行。
  • 自定义环境变量。
  • 最大执行持续时间。
  • 重试计数。
  • 文件保留时间。

本文介绍了如何使用 Batch .NET 库中的 JobPreparationTaskJobReleaseTask 类。

提示

作业准备和释放任务在共享池环境中特别有用。在这些环境中,计算节点池在任务运行之间持续存在,并由许多作业使用。

作业准备和释放任务的用例

作业准备和作业释放任务非常适合用于以下方案:

  • 下载通用任务数据。 Batch 作业通常需要一组通用数据作为作业任务的输入。 在执行作业的其他任务之前,可使用作业准备任务将此数据下载到每个节点。

    例如,在日常风险分析计算中,市场数据是特定于作业的,但对于作业中所有任务则是通用的。 可以使用作业准备任务将此市场数据(通常为几个 GB 大小)下载到每个计算节点,以便节点上运行的任何任务都可以使用它。

  • 删除作业和任务输出。 在共享池环境中,不会解除作业之间的池计算节点,因此可能需要删除运行之间的作业数据。 例如,你可能需要保留节点上的磁盘空间,或符合组织的安全策略。 可以使用作业释放任务删除作业准备任务下载或由该任务执行生成的数据。

  • 保留日志。 你可能想要保留任务生成的日志文件的副本,或由失败的应用程序生成的故障转储文件。 可以使用作业释放任务将此数据压缩并上传到 Azure 存储帐户

作业准备任务

在运行任务之前,Batch 将在计划运行任务的每个计算节点上运行作业准备任务。 默认情况下,Batch 会等待作业准备任务完成,然后再运行计划作业任务,但你可以将其配置为不等待。

如果节点重新启动,作业准备任务将再次运行,但可以禁用此行为。 如果某项作业包含作业准备任务和作业管理器任务,则先运行作业准备任务,然后再运行作业管理器任务和所有其他任务。 先运行始终是作业准备任务。

作业准备任务将仅运行在计划运行任务的节点上。 此行为可防止在未分配有任何任务的节点上进行不必要的运行。 当作业任务数小于池中的节点数时,可能不会向节点分配任何任务。 此行为也适用于启用了并发任务执行的情况,如果任务计数小于可能的并发任务总计,这可能会让一些节点处于空闲状态。

注意

JobPreparationTaskCloudPool.StartTask 的不同之处在于,JobPreparationTask 在每个作业启动时运行,而 StartTask 仅在计算节点首次加入池或重启时运行。

作业释放任务

将作业标记为已完成后,作业释放任务会在池中运行了作业准备任务的每个节点上运行。 可以通过发出终止请求将作业标记为已完成。 此请求会将作业状态设置为“正在终止”,从而终止与作业关联的任何活动任务或正在运行的任务,并运行作业释放任务。 然后,该作业将进入已完成状态。

注意

删除作业操作也会执行作业释放任务。 但如果已经终止了某个作业,则稍后删除该作业后,释放任务将不会再次运行。

在 Batch 任务终止作业释放任务之前,作业释放任务最多可运行 15 分钟。 有关详细信息,请查看 REST API 参考文档

使用 Batch .NET 执行作业准备和释放任务

要运行作业准备任务,可将 JobPreparationTask 对象分配到作业的 CloudJob.JobPreparationTask 属性。 同样,若要使用作业释放任务,请初始化 JobReleaseTask 并将它分配到作业的 CloudJob.JobReleaseTask

在下面的代码片段中,myBatchClientBatchClient 的实例,myPool 是 Batch 帐户中的现有池。

// Create the CloudJob for CloudPool "myPool"
CloudJob myJob =
    myBatchClient.JobOperations.CreateJob(
        "JobPrepReleaseSampleJob",
        new PoolInformation() { PoolId = "myPool" });

// Specify the command lines for the job preparation and release tasks
string jobPrepCmdLine =
    "cmd /c echo %AZ_BATCH_NODE_ID% > %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";
string jobReleaseCmdLine =
    "cmd /c del %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";

// Assign the job preparation task to the job
myJob.JobPreparationTask =
    new JobPreparationTask { CommandLine = jobPrepCmdLine };

// Assign the job release task to the job
myJob.JobReleaseTask =
    new JobReleaseTask { CommandLine = jobReleaseCmdLine };

await myJob.CommitAsync();

作业释放任务会在终止或删除作业时运行。 可使用 JobOperations.TerminateJobAsync 终止作业,并使用 JobOperations.DeleteJobAsync 删除作业。 通常在作业的任务完成时或者达到所定义的超时后终止或删除作业。

// Terminate the job to mark it as completed. Terminate initiates the
// job release task on any node that ran job tasks. Note that the
// job release task also runs when a job is deleted, so you don't
// have to call Terminate if you delete jobs after task completion.

await myBatchClient.JobOperations.TerminateJobAsync("JobPrepReleaseSampleJob");

GitHub 上的代码示例

要了解作业准备和释放任务的实际使用情况,请从 GitHub 生成并运行 JobPrepRelease 示例项目。 此控制台应用程序可执行以下操作:

  1. 创建包含两个节点的池。
  2. 创建具有作业准备、释放和标准任务的作业。
  3. 运行作业准备任务,该任务首先将节点 ID 写入节点的共享目录中的文本文件。
  4. 在每个节点上运行一个任务,该任务将其任务 ID 写入同一文本文件。
  5. 完成所有任务或达到超时后,将每个节点的文本文件内容打印到控制台。
  6. 完成作业后,运行作业释放任务以从节点中删除该文件。
  7. 打印每个节点上运行的作业准备和释放任务的退出代码。
  8. 暂停执行,以便确认删除作业和/或池。

示例应用程序的输出类似于以下示例:

Attempting to create pool: JobPrepReleaseSamplePool
Created pool JobPrepReleaseSamplePool with 2 nodes
Checking for existing job JobPrepReleaseSampleJob...
Job JobPrepReleaseSampleJob not found, creating...
Submitting tasks and awaiting completion...
All tasks completed.

Contents of shared\job_prep_and_release.txt on tvm-2434664350_1-20160623t173951z:
-------------------------------------------
tvm-2434664350_1-20160623t173951z tasks:
  task001
  task004
  task005
  task006

Contents of shared\job_prep_and_release.txt on tvm-2434664350_2-20160623t173951z:
-------------------------------------------
tvm-2434664350_2-20160623t173951z tasks:
  task008
  task002
  task003
  task007

Waiting for job JobPrepReleaseSampleJob to reach state Completed
...

tvm-2434664350_1-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

tvm-2434664350_2-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

Delete job? [yes] no
yes
Delete pool? [yes] no
yes

Sample complete, hit ENTER to exit...

注意

新池中节点的创建和启动时间各不相同意味着某些节点已早于其他节点准备好执行任务,因此你可能会看到不同的输出。 具体而言,由于任务很快完成,因此池的节点之一可能会运行作业的所有任务。 如果发生这种情况,则对于未运行任何任务的节点将不会存在作业准备和释放任务。

在 Azure 门户中查看作业准备和释放任务

可以使用 Azure 门户查看 Batch 作业属性和任务,包括作业准备和释放任务。 在 Batch 帐户页中,从左侧导航栏中选择“作业”,然后选择一个作业。 如果运行示例应用程序,则可在任务完成后、删除作业和池之前导航到作业页。

可以通过在“概述”或“任务”页上展开“大致任务计数”来监视作业进度和状态。

显示 Azure 门户中作业任务进度的屏幕截图。

以下屏幕截图显示了示例应用程序运行后的“JobPrepReleaseSampleJob”页。 此作业具有准备和释放任务,因此可以在左侧导航栏中选择“准备任务”或“释放任务”以查看其属性。

显示 Azure 门户中的作业释放任务属性的屏幕截图。

后续步骤