添加、计划或运行 Azure Batch 作业和任务时,可能会出现各种错误。 可以直接检测添加作业和任务时发生的错误。 API、命令行或用户界面通常会立即返回任何故障。 本文介绍在提交作业和任务后可能出现的错误,以及如何检查和处理这些错误。
作业失败
作业是指一项或多项任务的组,这些任务指定了要运行的命令行。 添加作业时,可以指定以下可选参数。 这些参数会影响作业失败的方式。
jobConstraints。 可以选择使用属性“
maxWallClockTime
”来设置作业可处于活动或运行状态的最长时间。 如果作业超过maxWallClockTime
,作业将终止,且 JobExecutionInformation 中的属性“terminateReason
”将被设置为“MaxWallClockTimeExpiry
”。JobPreparationTask。 可以选择性地指定一个作业准备任务,让其在计划运行作业任务的每个计算节点上运行。 节点会在首次运行作业任务之前运行作业准备任务。 如果作业准备任务失败,则任务不会运行,作业也不会完成。
JobReleaseTask。 你可以选择为具有作业准备任务的作业指定作业发布任务。 终止作业时,作业释放任务会在运行作业准备任务的每个池节点上运行。 如果作业释放任务失败,作业仍会进入“
completed
”状态。
在 Azure 门户中,可以在“批处理添加作业”屏幕的“作业管理器”、“准备和发布任务”以及“高级”部分中设置这些参数。
作业属性
检查 JobExecutionInformation 中的以下作业属性是否存在错误:
属性
terminateReason
指示MaxWallClockTimeExpiry
作业是否超出作业约束中指定的maxWallClockTime
,因此作业终止。 如果作业的属性“onTaskFailure
”设为“performExitOptionsJobAction
”,此属性也可设为“taskFailed
”,如果退出条件指定terminatejob
的jobAction
,则任务会失败。如果出现计划错误,则设置 JobschedulingError 属性。
作业准备任务
节点首次运行作业任务时,作业准备任务的实例会在每个计算节点上运行。 可将作业准备任务看作是一个任务模板,可以运行多个实例(上限为池中的节点数)。 检查作业准备任务实例,确定是否存在错误。
可以使用 Job - List Preparation and Release Task Status API 列出指定作业的所有作业准备和发布任务实例的执行状态。 与其他任务一样,JobPreparationTaskExecutionInformation 具有 failureInfo
、exitCode
和 result
等属性。
当作业准备任务运行时,触发作业准备任务的任务将移动到 preparing
的 taskState。 如果作业准备任务失败,则触发任务将还原到“active
”状态,并且不会运行。
如果作业准备任务失败,则触发作业任务不会运行。 作业未完成且停滞不前。 如果没有包含可计划的任务的其他作业,池可能会闲置。
作业发布任务
在运行作业准备任务的每个节点上,如果作业被终止,则作业发布任务会运行。 检查作业发布任务实例,确定是否存在错误。
可以使用 Job - List Preparation and Release Task Status API 列出指定作业的所有作业准备和发布任务实例的执行状态。 与其他任务一样,JobReleaseTaskExecutionInformation 具有 failureInfo
、exitCode
和 result
等属性。
如果一个或多个作业发布任务失败,该作业仍会终止,并变为 completed
状态。
任务失败
作业任务可能出于以下原因而失败:
- 任务命令行失败,返回非零退出代码。
- 为任务指定的一个或多个
resourceFiles
未下载。 - 为任务指定的一个或多个
outputFiles
未上传。 - 任务的运行时间超过了 TaskConstraints 中指定的属性“
maxWallClockTime
”。
在所有情况下,都必须检查以下属性是否存在错误,并查看错误相关信息:
TaskExecutionInformation 属性包含可提供错误相关信息的多个属性。 taskExecutionResult 指示任务失败的原因,
exitCode
和failureInfo
提供有关失败的详细信息。无论任务是成功还是失败,任务始终会转为
completed
TaskState。
考虑任务失败对作业和所有任务依赖项的影响。 可以指定 ExitConditions 来为依赖项和作业配置操作。
- DependencyAction 控制是阻止还是运行依赖于失败任务的任务。
- JobAction 控制失败任务是否会导致作业被禁用、终止还是保持不变。
任务命令行
任务命令行不在计算节点上的 shell 下运行,因此它们无法在本地利用 shell 功能(例如环境变量扩展)。 若要利用此类功能,必须在命令行中调用 shell。 有关详细信息,请参阅环境变量的命令行扩展。
任务命令行输出会写入 stderr.txt 和 stdout.txt 文件。 应用程序还可能写入应用程序专属的日志文件。 请确保为应用程序实施全面的错误检查,以便及时检测和诊断问题。
任务日志
如果运行任务的池节点仍然存在,则可以获取并查看任务日志文件。 多个 API 允许列出和获取任务文件,例如“文件 - 从任务获取”。 还可以使用 Azure 门户列出和查看任务或节点的日志文件。
在该节点的“概述”页上,选择“上传 Batch 日志”。
在“上传 Batch 日志”页上,选择“选取存储容器”,选择要上传到的 Azure 存储容器,然后选择“开始上传”。
可以从存储容器页查看、打开或下载日志。
输出文件
由于 Batch 池和池节点通常是临时节点,因此在持续添加和删除节点的情况下,最好在作业运行时保存日志文件。 任务输出文件是将日志文件保存到 Azure 存储的一种简便方法。 有关详细信息,请参阅使用 Batch 服务 API 将任务数据保存到 Azure 存储。
每次上传文件时,Batch 都会将以下两个日志文件写入计算节点:fileuploadout.txt 和 fileuploaderr.txt。 可以检查这些日志文件来详细了解具体的失败情况。 如果从未尝试上传文件(例如,因为任务本身无法运行),则这些日志文件不会存在。
后续步骤
- 详细了解 Batch 作业和任务以及作业准备和发布任务。
- 了解 Batch 池和节点错误。