本页介绍了如何解决与批处理相关的问题。
如果您尝试对尚未完成的作业进行问题排查 错误消息,检查作业的记录中是否包含 查看状态事件来细分错误消息 然后再查看本文档。
如需详细了解如何排查作业问题,另请参阅以下内容 文档:
作业创建错误
如果您无法创建作业,可能是因为本部分中的某个错误。
配额不足
问题
尝试创建作业时发生以下问题之一:
当作业在
QUEUED
状态、 以下网页出现在statusEvents
字段:Quota checking process decides to delay scheduling for the job JOB_UID due to inadequate quotas [Quota: QUOTA_NAME, limit: QUOTA_LIMIT, usage: QUOTA_CURRENT_USAGE, wanted: WANTED_QUOTA.].
此问题表示作业已延迟,因为
QUOTA_NAME
配额的当前用量 (QUOTA_USAGE
) 和限制 (QUOTA_LIMIT
) 阻止了作业的请求用量 (WANT_QUOTA
)。当作业处于
QUEUED
、SCHEDULED
或FAILED
状态时,statusEvents
字段中会显示以下问题之一:RESOURCE_NAME creation failed: Quota QUOTA_NAME exceeded. Limit: QUOTA_LIMIT in region REGION
RESOURCE_NAME creation failed: Quota QUOTA_NAME exceeded. Limit: QUOTA_LIMIT in zone ZONE
此问题表示,由于请求超出了您的
QUOTA_NAME
配额(在指定位置的配额上限为QUOTA_LIMIT
),因此创建资源失败。
解决方案
如需解决此问题,请执行以下操作:
如果作业延迟,请尝试等待系统释放更多配额。
如果作业因配额不足而失败,或者这些延迟问题持续存在,请尝试执行以下任一操作,以防止配额不足:
创建使用较少配额或其他配额的作业。 例如,为 或者在其他项目中拆分配额用量。
向 Google Cloud 申请为您的项目提高配额上限。
权限不足,无法充当服务账号
问题
尝试创建作业时发生以下问题:
如果作业不使用实例模板,则问题会显示如下所示:
caller does not have access to act as the specified service account: SERVICE_ACCOUNT_NAME
如果作业使用实例模板,问题如下所示:
Error: code - CODE_SERVICE_ACCOUNT_MISMATCH, description - The service account specified in the instance template INSTANCE_TEMPLATE_SERVICE_ACCOUNT doesn't match the service account specified in the job JOB_SERVICE_ACCOUNT for JOB_UID, project PROJECT_NUMBER
此问题通常是因为创建作业的用户没有足够的权限来充当作业使用的服务账号,而这由 iam.serviceAccounts.actAs
权限控制。
解决方案
如需解决此问题,请执行以下操作:
- 如果作业使用实例模板,请验证实例模板中指定的服务账号是否与作业定义中指定的服务账号一致。
- 确保为作业指定的服务账号已向创建作业的用户授予 Service Account User 角色 (
roles/iam.serviceAccountUser
)。如需了解详情,请参阅管理访问权限。 - 重新创建作业。
重复的网络
问题
尝试创建作业时会出现以下问题:
Networks must be distinct for NICs in the same InstanceTemplate
出现此问题是因为您为作业多次指定了网络。
解决方案
如需解决此问题,请重新创建作业,并使用 以下选项之一:
- 虚拟机实例模板:如果您想要 在创建此作业时使用虚拟机实例模板, 您必须在虚拟机实例模板中指定网络。
network
和subnetwork
字段:使用 Batch API 创建作业时,可以在请求正文中使用这些字段;使用 gcloud CLI 创建作业时,可以在 JSON 配置文件中使用这些字段。--network
和--subnetwork
标志:使用 gcloud CLI 创建作业时,可以将这些标志与gcloud batch jobs submit
命令搭配使用。
如需了解详情,请参阅 为作业指定网络。
VPC Service Controls 的网络无效
问题
尝试创建作业时会出现以下问题:
no_external_ip_address field is invalid. VPC Service Controls is enabled for the project, so external ip address must be disabled for the job. Please set no_external_ip_address field to be true
解决方案
出现此问题是因为您尝试使用具有外部 IP 地址的虚拟机在 VPC Service Controls 服务边界中创建和运行作业。
如需解决此问题,请执行以下操作: 创建一个阻止所有虚拟机的外部访问的作业。
如需详细了解如何为 Cloud Storage 中的作业配置网络, VPC Service Controls 服务边界 请参阅将 VPC Service Controls 与 Batch 搭配使用。
作业问题和失败错误
如果某项作业未正确运行或运行失败, 原因不明,可能是由于本部分中的某个错误 或以下代码中的一个退出代码 任务失败退出代码部分。
Cloud Logging 中没有日志
问题
您需要调试作业,但 Cloud Logging 中没有显示该作业的日志。
出现此问题通常是由于以下原因:
- 您的项目未启用 Cloud Logging API。 即使您为作业的日志正确配置了所有其他内容,如果您的项目未启用该服务,作业也不会生成日志。
- 该作业的服务账号没有写入权限 日志。如果作业没有相应权限,则无法生成日志。
- 作业未配置为生成日志。如需在 Cloud Logging 中生成日志,作业需要启用 Cloud Logging。作业的 还应配置 Runnable,以写入您希望 出现在日志中的标准输出 (stdout) 和 标准错误 (stderr) 流。如需了解详情,请参阅使用日志分析作业。
- 任务未运行。只有在任务分配了资源并开始运行后,才能生成日志。
- Cloud Logging 已配置为自动排除作业的日志。 如果您已经配置了 Batch 作业,则无法显示来自 Batch 作业的日志 Cloud Logging 的排除项过滤器 导致 Batch 作业的日志被排除在外。
解决方案
如需解决此问题,请执行以下操作:
- 停用当前的所有 Cloud Logging 排除过滤条件,确保日志不会自动从 Cloud Logging 中排除。
- 确保您的项目已启用 Cloud Logging API。
- 确保作业的服务账号具有 Logs Writer (
roles/logging.logWriter
) IAM 角色。如需了解详情,请参阅为项目启用批处理。 - 使用 gcloud CLI 或 Batch API 查看作业的详细信息。该作业详情可帮助您了解未得到该作业的原因
生成日志,并可能会提供您希望
从日志中获取。例如,执行以下操作:
- 要验证日志记录是否已启用,请查看作业的
logsPolicy
字段。 - 如需验证作业是否已成功运行,请查看作业的
status
字段。
- 要验证日志记录是否已启用,请查看作业的
进行任何更改后,请重新创建作业并等待作业运行完毕,然后再检查日志。
没有服务代理报告
问题
以下问题出现在
statusEvents
字段
创建虚拟机之前,对于未正常运行或失败的作业:
No VM has agent reporting correctly within time window NUMBER_OF_SECONDS seconds, VM state for instance VM_NAME is TIMESTAMP,agent,start
该问题表明作业的所有虚拟机均未向 批量服务代理。
出现此问题通常是由于以下原因:
- 作业的虚拟机没有足够的权限。
作业的虚拟机需要特定权限才能向批处理服务代理报告其状态。您可以通过向作业的服务账号授予批处理代理报告程序角色 (
roles/batch.agentReporter
),为作业的虚拟机提供这些权限。 - 此作业的虚拟机存在网络问题。作业的虚拟机需要网络访问权限才能与批处理服务代理通信。
- 作业的虚拟机使用的是过时的批处理虚拟机操作系统映像,或者使用的虚拟机操作系统映像包含过时的批处理服务代理软件。 作业的虚拟机需要其虚拟机操作系统映像中的软件, 当前依赖项,以便向 批处理服务代理。
解决方案
如需解决此问题,请执行以下操作:
验证作业的虚拟机是否具有报告其状态所需的权限 Batch 服务代理。
- 如需识别作业的服务账号,请使用 gcloud CLI 或 Batch API 查看作业的详细信息。如果未列出任何服务账号,作业将默认使用 Compute Engine 默认服务账号。
确认该作业的服务账号 Batch Agent Reporter 角色 (
roles/batch.agentReporter
).如需了解详情,请参阅 管理访问权限和 限制服务账号的使用。例如,如需向 Compute Engine 默认服务账号授予所需权限,请使用以下命令:
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/batch.agentReporter \ --member serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com
如果您为作业指定了虚拟机操作系统映像,请验证该虚拟机操作系统映像目前是否受支持。
如果您为作业启用了 Cloud Logging,则可以通过检查以下任一代理日志 (
batch_agent_logs
) 来识别此问题。如需了解详情,请参阅使用日志分析作业。过时 Batch 服务代理软件错误的日志:
rpc error: code = FailedPrecondition, desc = Invalid resource state for BATCH_AGENT_VERSION: outdated Batch agent version used.
BATCH_AGENT_VERSION 是用于与作业使用的 Batch Service Agent 通信的软件版本,例如
cloud-batch-agent_20221103.00_p00
。过期的 Batch 虚拟机操作系统映像错误日志:
rpc error: code = FailedPrecondition, desc = Invalid resource state for BATCH_VM_OS_IMAGE_NAME: outdated Batch image version.
BATCH_VM_OS_IMAGE_NAME 是 作业使用的 Batch 中的虚拟机操作系统映像,例如
batch-debian-11-20220909-00-p00
。
您可以使用较新的虚拟机操作系统映像来解决此问题。 如果作业使用自定义映像,请根据受支持的最新版本公共映像重新创建自定义映像。
如需了解详情,请参阅支持的虚拟机操作系统映像 和查看虚拟机操作系统映像。
重新创建作业。
Cloud Monitoring 中缺少资源指标
问题
您想查看作业的资源指标,但部分或全部预期指标缺失。
出现此问题通常是因为:
- 您的项目未启用该 API。 即使您正确配置了项目中的其他所有项目 指标可能不会显示。 对于运维代理,您还必须启用 Cloud Logging API。
- 您的权限不足,无法查看这些指标。如果您没有足够的权限,将无法查看指标。
- 此作业的虚拟机未运行。只有当作业的至少一个虚拟机处于运行状态时,系统才会为作业生成指标。
- 作业的配置或权限不支持 Ops Agent 指标。 某些资源指标只能由 Ops Agent 提供。为 Ops Agent 提供支持 代理指标,作业必须符合 Ops Agent 的要求,安装 Ops Agent,并使用可写入指标的服务账号, 监控。
- 您需要使用其他方法或过滤条件才能查看指标。 某些用于查看指标的方法在虚拟机被删除后不会显示虚拟机的指标。此外,如果指标被过滤器忽略,系统将不会显示这些指标 或显示的时间段此外,指标图表还包含 可能会导致少量数据过薄,无法显示的分辨率。
- 指标已删除。指标删除后便无法查看 监控保留期结束后, 。
解决方案
如果只有 Ops Agent 指标缺失,请先尝试通过以下步骤解决问题:
- 请执行以下操作来验证作业的配置:
- 如需查看作业的完整配置信息,请使用 gcloud CLI 或 Batch API 查看作业的详细信息。在其余步骤中使用输出。
- 确保作业的服务账号具有写入 Ops Agent 指标的权限。
- 确保作业满足所有 Ops Agent 要求。
- 确保该作业正确安装 Ops Agent。虽然可以在可运行文件中手动安装 Ops Agent,但推荐的方法是将
installOpsAgent
字段设置为true
,以自动安装 Ops Agent。
- 如果问题仍然存在,请参阅 排查 Ops Agent 问题 。
否则,请执行以下操作来解决此问题:
- 确保您的项目已启用 Monitoring API:
- 确保作业的虚拟机已开始运行,并且运行时间仍在监控保留期限内。您可以通过查看作业的详细信息来查看作业的运行时间。
- 验证您用于查看的方法没有任何问题 执行以下操作:
- 如果问题仍然存在,请参阅 Google Cloud Observability 文档中的排查 Cloud Monitoring 问题页面。
虚拟机外部 IP 地址违反了限制
问题
以下问题出现在
statusEvents
字段
:
Instance VM_NAME creation failed: Constraint constraints/compute.vmExternalIpAccess violated for project PROJECT_NUMBER. Add instance VM_NAME to the constraint to use external IP with it.
出现此问题是因为您的项目、文件夹或组织设置了 compute.vmExternalIpAccess
组织政策限制,因此只有列入许可名单的虚拟机才能使用外部 IP 地址。
解决方案
如需解决此问题,请重新创建作业,并执行以下一项操作:
- 使用不受此限制约束的项目。
- 创建一个阻止所有虚拟机的外部访问的作业。
违反了针对可信映像的限制条件
问题
失败作业的 statusEvents
字段中显示以下问题:
Instance VM_NAME creation failed: Constraint constraints/compute.trustedImageProjects violated for project PROJECT_ID. Use of images from project batch-custom-image is prohibited.
解决方案
出现此问题的原因是您的项目设置了
可信映像 (compute.trustedImageProjects
) 政策限制条件
这样批量处理的图片
batch-custom-image
映像项目,不允许使用。
如需解决此问题,请至少执行以下某项操作:
- 重新创建作业,以指定可信映像政策约束条件已允许的虚拟机操作系统映像。
- 请让管理员允许修改
可信映像政策限制条件,以允许来自
batch-custom-image
映像项目。有关说明,请参阅 控制对 Batch 的虚拟机操作系统映像的访问权限。
使用实例模板时,作业失败
问题
以下问题出现在
statusEvents
字段
针对使用实例模板的失败作业:
INVALID_FIELD_VALUE,BACKEND_ERROR
出现此问题是因为作业的实例模板存在不明确的问题。
解决方案
如需进一步调试此问题,请执行以下操作:
任务失败退出代码
当作业中的特定任务失败时,该任务会返回非零退出代码。根据您配置
ignoreExitStatus
字段、
失败的任务不一定会导致作业失败。
除了您在可运行程序中定义的任何退出代码之外,批处理作业还有几个预留的退出代码,包括以下退出代码。
虚拟机抢占 (50001)
问题
以下问题出现在
statusEvents
字段
:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to Spot Preemption with exit code 50001.
当作业的 Spot 虚拟机时,就会出现此问题 在运行期间被抢占
解决方案
如需解决此问题,请执行以下操作之一:
- 使用 任务自动重试 或手动重新运行作业。
- 为保证不发生抢占,请使用 标准预配模型
虚拟机报告超时 (50002)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to Batch no longer receives VM updates with exit code 50002.
如果后端发生超时,导致 Batch 不再从虚拟机收到作业的更新,就会出现此问题。遗憾的是,许多硬件故障或软件故障会导致虚拟机 无响应 - 例如,虚拟机可能因临时主机而崩溃 事件或 资源不足。
解决方案
如需解决此问题,请执行以下操作:
- 如果问题是暂时的并自行解决,请通过以下方式重试任务: 使用自动重试任务或手动重试 重新运行作业
如果问题仍然存在,请执行以下一项或多项操作,找出导致虚拟机无响应的原因并加以解决:
建议:通过以下方式获取支持: Google Cloud 支持或 Cloud 论坛上的批量标签。
尝试自行找出问题并加以解决。例如,如果您熟悉 Compute Engine,可以尝试执行以下操作来排查作业的虚拟机问题:
如需确定作业虚拟机的名称,请执行以下操作:
- 查看作业的日志。
- 过滤日志,以查找包含字词组
report agent state:
的条目。 查看日志,确定每项任务的每次尝试所用的虚拟机。每个日志均类似于以下内容,其中 一个
instance:
短语以及一个或多个task_id:
短语。report agent state: ... instance:"INSTANCE_NAME" ... task_id:"task/JOB_UID-group0-TASK_INDEX/TASK_RETRIES/0 ..."
此日志包含以下值:
INSTANCE_NAME
:虚拟机的名称。JOB_UID
:作业的唯一 ID (UID)。TASK_INDEX
:任务的编号。TASK_RETRIES
:任务的尝试 此虚拟机上运行的实例数,其格式为重试次数。 例如,对于任务的首次尝试,此值为0
。除非您启用自动任务重试,否则系统只会尝试执行每项任务一次。
使用 Compute Engine 对作业的虚拟机进行问题排查 文档。有关示例,请参见 排查虚拟机关停和重新启动问题 和 排查虚拟机启动问题。
虚拟机在执行期间重新启动 (50003)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to VM is rebooted during task execution with exit code 50003.
如果作业的虚拟机在运行时意外重新启动,就会出现此问题。
解决方案
要解决此问题,请使用 任务自动重试 或手动重新运行作业。
虚拟机和任务无响应 (50004)
问题
以下问题出现在
statusEvents
字段
:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to tasks cannot be canceled with exit code 50004.
当任务达到无响应时间限制且无法取消时,就会出现此问题。
解决方案
如需解决此问题,请使用自动任务重试或手动重新运行作业来重试任务。
任务运行时间超出上限 (50005)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to task runs over the maximum runtime with exit code 50005.
此问题会在以下情况下出现:
- 任务的运行时间超出了
maxRunDuration
字段中指定的时间限制 - 可运行代码的运行时间超出了
timeout
字段中指定的时间限制
为了明确确定超出了哪个时间限制
查看作业的日志
并找到提及 50005
退出代码的日志。此 textPayload
字段
会指明超出时间限制的位置和时间。
解决方案
要解决此问题,请尝试验证 超出时间限制的任务或可运行状态。 然后,执行以下操作之一:
如果您只是偶尔遇到此错误,例如由于任务或可运行 运行时间不一致,您可以尝试重新创建作业, 自动执行任务重试 来尝试提高成功率
否则,如果任务或可运行对象需要比当前超时允许的时间更长的时间才能完成运行,请设置更长的超时时间。
执行期间重新创建的虚拟机 (50006)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to VM is recreated during task execution with exit code 50006.
如果作业的虚拟机在运行时意外重新创建,就会出现此问题。
解决方案
如需解决此问题,请使用自动任务重试或手动重新运行作业来重试任务。