本页面介绍了如何解决与 Batch 相关的问题。
如果您要尝试对没有收到错误消息的作业进行问题排查,请先查看状态事件,检查作业的历史记录是否包含任何错误消息,然后再查看本文档。
如需详细了解如何对作业进行问题排查,另请参阅以下文档:
作业创建错误
如果您无法创建作业,则可能是由于本部分中的某个错误所致。
配额不足
问题
尝试创建作业时会出现以下某个问题:
当作业处于
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
解决方案
出现此问题是因为您正尝试使用在 VPC Service Controls 服务边界内具有外部 IP 地址的虚拟机来创建并运行作业。
如需解决此问题,请创建一个作业以阻止所有虚拟机的外部访问。
如需详细了解如何在 VPC Service Controls 服务边界中为作业配置网络,请参阅将 VPC Service Controls 与 Batch 搭配使用。
作业失败错误
如果作业无法正确运行或因原因不明而失败,则可能是由于本部分中的某个错误或以下任务失败退出代码部分中的某个退出代码所致。
Cloud Logging 中没有任何日志
问题
您需要调试某个作业,但 Cloud Logging 中不会显示该作业的日志。
出现该问题的原因通常有以下几种:
- 您的项目未启用 Cloud Logging API。 如果您的项目未启用该服务,即使您为作业的日志正确配置了所有其他内容,也不会生成日志。
- 该作业的服务帐号没有写入日志的权限。如果没有足够权限,作业无法生成日志。
- 作业未配置为生成日志。如需在 Cloud Logging 中生成日志,作业需要启用 Cloud Logging。该作业的可运行对象还应配置为将您希望显示在日志中的任何信息写入标准输出 (stdout) 和标准错误 (stderr) 流。如需了解详情,请参阅使用日志分析作业。
- 任务未运行。在为任务分配资源并开始运行之前,无法生成日志。
- Cloud Logging 已配置为自动排除作业的日志。 如果您已配置 Cloud Logging 排除项过滤器,以排除来自 Batch 作业的日志,则批量作业中的日志不会显示。
解决方案
如需解决此问题,请执行以下操作:
- 通过停用任何当前 Cloud Logging 的排除项过滤器,确保系统不会从 Cloud Logging 中自动排除日志。
- 确保您的项目已启用 Cloud Logging API。
- 确保该作业的服务帐号具有 Logs Writer (
roles/logging.logWriter
) IAM 角色。 如需了解详情,请参阅为项目启用 Batch。 - 使用 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
此问题表示作业没有任何虚拟机向 Batch 服务代理报告。
出现该问题的原因通常有以下几种:
- 作业的虚拟机权限不足。
作业的虚拟机需要特定权限才能将其状态报告给 Batch 服务代理。您可以通过向作业的服务帐号授予 Batch Agent Reporter 角色 (
roles/batch.agentReporter
) 来为作业的虚拟机提供这些权限。 - 作业的虚拟机存在网络问题。作业的虚拟机需要网络访问权限才能与 Batch 服务代理通信。
- 该作业的虚拟机使用的是已过时的批处理虚拟机操作系统映像,或使用了包含过时的 Batch 服务代理软件的虚拟机操作系统映像。 该作业的虚拟机需要其虚拟机操作系统映像中的软件,该软件可提供当前依赖项以向 Batch 服务代理报告。
解决方案
如需解决此问题,请执行以下操作:
验证作业的虚拟机是否具有向 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 服务代理通信的软件版本,例如
cloud-batch-agent_20221103.00_p00
。关于过时的批处理虚拟机操作系统映像错误的日志:
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
。
您可以使用较新的虚拟机操作系统映像来解决此问题。如果作业使用自定义映像,请基于某个受支持的公共映像的最新版本来重新创建自定义映像。
如需了解详情,请参阅支持的虚拟机操作系统映像和查看虚拟机操作系统映像。
重新创建作业。
违反了虚拟机外部 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 映像。
如需解决此问题,请至少执行以下一项操作:
- 重新创建作业以指定可信映像政策限制条件允许的虚拟机操作系统映像。
- 请让管理员允许修改可信映像政策限制条件,以允许
batch-custom-image
映像项目中的虚拟机操作系统映像。有关说明,请参阅控制对 Batch 的虚拟机操作系统映像的访问权限。
使用实例模板时作业失败
问题
对于使用实例模板的失败作业,statusEvents
字段中会显示以下问题:
INVALID_FIELD_VALUE,BACKEND_ERROR
出现此问题是因为该作业的实例模板存在不明确的问题。
解决方案
如需进一步调试问题,请执行以下操作:
任务失败退出代码
当作业中的特定任务失败时,该任务会返回非零退出代码。失败的任务不一定会导致作业失败,具体取决于您配置 ignoreExitStatus
字段的方式。
除了您在可运行对象中定义的任何退出代码之外,Batch 还有几个预留的退出代码,包括以下退出代码。
虚拟机抢占 (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.
如果后端存在超时导致作业的虚拟机不再接收更新,就会出现此问题。
解决方案
如需解决此问题,请通过自动重试任务或手动重新运行作业来重试任务。
执行期间虚拟机重新启动 (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.
如果作业的虚拟机在运行时意外重新创建,就会出现此问题。
解决方案
如需解决此问题,请通过自动重试任务或手动重新运行作业来重试任务。