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 提供有关失败的详细信息。

  • 无论任务是成功还是失败,任务始终会转为 completed TaskState

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

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

任务命令行

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

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

任务日志

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

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

    突出显示“上传 Batch 日志”的节点概述页面的屏幕截图。

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

    “上传 Batch 日志”页面的屏幕截图

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

    存储容器中的任务日志的屏幕截图。

输出文件

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

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

后续步骤