Azure Batch 作业和任务错误

添加、计划或运行 Azure Batch 作业和任务时,可能会出现各种错误。 可以直接检测添加作业和任务时发生的错误。 API、命令行或用户界面通常会立即返回任何故障。 本文介绍在提交作业和任务后可能出现的错误,以及如何检查和处理这些错误。

作业失败

作业是指一项或多项任务的组,这些任务指定了要运行的命令行。 添加作业时,可以指定以下可选参数。 这些参数会影响作业失败的方式。

  • jobConstraints。 可以选择使用属性“maxWallClockTime”来设置作业可处于活动或运行状态的最长时间。 如果作业超过 maxWallClockTime,作业将终止,且 JobExecutionInformation 中的属性“terminateReason”将被设置为“MaxWallClockTimeExpiry”。

  • JobPreparationTask。 可以选择性地指定一个作业准备任务,让其在计划运行作业任务的每个计算节点上运行。 节点会在首次运行作业任务之前运行作业准备任务。 如果作业准备任务失败,则任务不会运行,作业也不会完成。

  • JobReleaseTask。 你可以选择为具有作业准备任务的作业指定作业发布任务。 终止作业时,作业释放任务会在运行作业准备任务的每个池节点上运行。 如果作业释放任务失败,作业仍会进入“completed”状态。

在 Azure 门户中,可以在“批处理添加作业”屏幕的“作业管理器”、“准备和发布任务”以及“高级”部分中设置这些参数。

作业属性

检查 JobExecutionInformation 中的以下作业属性是否存在错误:

  • 属性 terminateReason 指示MaxWallClockTimeExpiry作业是否超出作业约束中指定的maxWallClockTime,因此作业终止。 如果作业的属性“onTaskFailure”设为“performExitOptionsJobAction”,此属性也可设为“taskFailed”,如果退出条件指定terminatejobjobAction,则任务会失败。

  • 如果出现计划错误,则设置 JobschedulingError 属性。

作业准备任务

节点首次运行作业任务时,作业准备任务的实例会在每个计算节点上运行。 可将作业准备任务看作是一个任务模板,可以运行多个实例(上限为池中的节点数)。 检查作业准备任务实例,确定是否存在错误。

可以使用 Job - List Preparation and Release Task Status API 列出指定作业的所有作业准备和发布任务实例的执行状态。 与其他任务一样,JobPreparationTaskExecutionInformation 具有 failureInfoexitCoderesult 等属性。

当作业准备任务运行时,触发作业准备任务的任务将移动到 preparingtaskState。 如果作业准备任务失败,则触发任务将还原到“active”状态,并且不会运行。

如果作业准备任务失败,则触发作业任务不会运行。 作业未完成且停滞不前。 如果没有包含可计划的任务的其他作业,池可能会闲置。

作业发布任务

在运行作业准备任务的每个节点上,如果作业被终止,则作业发布任务会运行。 检查作业发布任务实例,确定是否存在错误。

可以使用 Job - List Preparation and Release Task Status API 列出指定作业的所有作业准备和发布任务实例的执行状态。 与其他任务一样,JobReleaseTaskExecutionInformation 具有 failureInfoexitCoderesult 等属性。

如果一个或多个作业发布任务失败,该作业仍会终止,并变为 completed 状态。

任务失败

作业任务可能出于以下原因而失败:

  • 任务命令行失败,返回非零退出代码。
  • 为任务指定的一个或多个 resourceFiles 未下载。
  • 为任务指定的一个或多个 outputFiles 未上传。
  • 任务的运行时间超过了 TaskConstraints 中指定的属性“maxWallClockTime”。

在所有情况下,都必须检查以下属性是否存在错误,并查看错误相关信息:

  • TaskExecutionInformation 属性包含可提供错误相关信息的多个属性。 taskExecutionResult 指示任务失败的原因,exitCodefailureInfo 提供有关失败的详细信息。

  • 任务不论成功或失败,始终会转到 completedTaskState

考虑任务失败对作业和所有任务依赖项的影响。 可以指定 ExitConditions 来为依赖项和作业配置操作。

  • DependencyAction 控制是阻止还是运行依赖于失败任务的任务。
  • JobAction 控制失败任务是否会导致作业被禁用、终止还是保持不变。

任务命令行

任务命令行不在计算节点上的 shell 下运行,因此它们无法在本地利用 shell 功能(例如环境变量扩展)。 若要利用此类功能,必须在命令行中调用 shell。 有关详细信息,请参阅环境变量的命令行扩展

任务命令行输出会写入 stderr.txtstdout.txt 文件。 应用程序还可能写入应用程序专属的日志文件。 请确保为应用程序实施全面的错误检查,以便及时检测和诊断问题。

任务日志

如果运行任务的池节点仍然存在,则可以获取并查看任务日志文件。 多个 API 允许列出和获取任务文件,例如“文件 - 从任务获取”。 还可以使用 Azure 门户列出和查看任务或节点的日志文件。

  1. 在该节点的“概述”页上,选择“上传 Batch 日志”。

    Screenshot of a node overview page with Upload batch logs highlighted.

  2. 在“上传 Batch 日志”页上,选择“选取存储容器”,选择要上传到的 Azure 存储容器,然后选择“开始上传”。

    Screenshot of the Upload batch logs page.

  3. 可以从存储容器页查看、打开或下载日志。

    Screenshot of task logs in a storage container.

输出文件

由于 Batch 池和池节点通常是临时节点,因此在持续添加和删除节点的情况下,最好在作业运行时保存日志文件。 任务输出文件是将日志文件保存到 Azure 存储的一种简便方法。 有关详细信息,请参阅使用 Batch 服务 API 将任务数据保存到 Azure 存储

每次上传文件时,Batch 都会将以下两个日志文件写入计算节点:fileuploadout.txtfileuploaderr.txt。 可以检查这些日志文件来详细了解具体的失败情况。 如果从未尝试上传文件(例如,因为任务本身无法运行),则这些日志文件不会存在。

后续步骤