排查 Dataflow 中的自定义容器问题

本文档介绍如何排查将自定义容器与 Dataflow 搭配使用时可能遇到的问题。它侧重于容器或工作器无法启动的问题。如果工作器能够启动且工作正在进行,请按照排查流水线问题中的一般指南进行操作。

在与支持团队联系之前,请确保您已排除与容器映像相关的问题:

  • 按照各步骤操作以在本地测试容器映像
  • 作业日志工作器日志中搜索错误,并将找到的所有错误与常见错误指南进行比较。
  • 确保用于启动流水线的 Apache Beam SDK 版本和语言版本与自定义容器映像上的 SDK 版本匹配。
  • 如果使用 Java,请确保用于启动流水线的 Java 主要版本与容器映像中安装的版本匹配。
  • 如果使用的是 Python,请确保用于启动流水线的 Python 主要版本和次要版本与容器映像中安装的版本匹配,并且映像不存在冲突的依赖项。您可以运行 pip check 进行确认。

查找与自定义容器相关的工作器日志

可以使用 Logs Explorer 微调与容器相关的错误消息的 Dataflow 工作器日志:

  1. 选择日志名称。自定义容器启动错误最有可能是下列其中一项:

    • dataflow.googleapis.com/kubelet
    • dataflow.googleapis.com/docker
    • dataflow.googleapis.com/worker-startup
    • dataflow.googleapis.com/harness-startup
  2. 选择 Dataflow Step 资源并指定 job_id

如果您看到 Error Syncing pod... 日志消息,请遵循常见的错误指南。您可以使用 Logs Explorer 通过以下查询在 Dataflow 工作器日志中查询这些日志消息:

resource.type="dataflow_step" AND jsonPayload.message:("IMAGE_URI") AND severity="ERROR"

常见问题

以下是使用自定义容器时的一些常见问题。

作业有错误或失败,因为无法拉取容器映像

Dataflow 工作器必须能够访问自定义容器映像。如果工作器因无效的网址、错误配置的凭据或缺少网络访问权限而无法拉取映像,则工作器将无法启动。

对于未启动任何工作且多个工作器无法按顺序启动的批处理作业,Dataflow 会使作业失败。否则,Dataflow 会记录错误,但不会采取进一步的操作来避免破坏长时间运行的作业状态。

如需了解如何解决此问题,请参阅“排查 Dataflow 错误”页面中的映像拉取请求失败,发生错误

工作器无法启动或工作没有进展

有时,如果 SDK 容器因错误而无法启动,则 Dataflow 无法确定该错误是永久性错误还是严重错误。然后,Dataflow 会持续尝试重启工作器。

如果没有明显错误,但您在 dataflow.googleapis.com/kubelet 中看到 [topologymanager] RemoveContainer INFO 级日志,则这些日志指示自定义容器映像提前退出,并且未启动长时间运行的工作器 SDK 进程。

如果工作器已成功启动,但没有发生任何工作,则错误可能会阻止 SDK 容器启动。在这种情况下,诊断建议中会显示以下错误:

Failed to start container

此外,工作器日志不包含以下行:

Executing: python -m apache_beam.runners.worker.sdk_worker_main or Executing: java ... FnHarness

工作器日志 中查找特定错误,并查看常见错误指南

这些问题的常见原因包括:

  • 软件包安装问题,例如由于依赖项问题而导致的 pip 安装错误。请参阅同步 pod 时出错 ...“StartContainer”失败
  • 如果使用的容器与工作器虚拟机的 CPU 架构不兼容,则您可能会看到类似于 exec format error 的错误。如需了解详情,请参阅同步 pod 时出错 ...“StartContainer”失败
  • 自定义命令参数或在 Dockerfile 中设置的 ENTRYPOINT 错误。例如,自定义 ENTRYPOINT 不会启动默认启动脚本 /opt/apache/beam/boot,也不会将参数适当地传递给此脚本。如需了解详情,请参阅修改容器入口点
  • Apache Beam SDK 版本与启动环境和运行时环境不匹配时的错误。在一种故障模式下,Apache Beam SDK 流水线选项中设置的默认值可能无法识别。例如,您可能会在工作器日志中看到诸如 sdk_worker_main.py: error: argument --flink_version: invalid choice: '1.16' (choose from '1.12', '1.13', '1.14', '1.15') 之类的错误。如需修复此错误,请在容器映像中安装与启动流水线相同的 Apache Beam SDK 版本。如需了解详情,请参阅使启动环境与运行时环境兼容