排查 DAG 处理器问题

Managed Airflow(第 3 代) | Managed Airflow(第 2 代) | Managed Airflow(旧版第 1 代)

本页面仅涉及与 DAG 文件处理相关的问题,如需了解调度任务的问题,请参阅 Airflow 调度器问题排载

工作流问题排查

检查 DAG 处理器日志

如果您有复杂的 DAG,Airflow DAG 处理器可能无法解析所有 DAG。这可能会导致许多问题,这些问题具有以下症状。

症状

  • 如果 DAG 处理器在解析 DAG 时遇到问题,则可能会导致列出的问题组合。如果 DAG 是动态生成的,与静态 DAG 相比,这些问题的影响可能更大。

    • DAG 在 Airflow 界面和 DAG 界面中不可见。
    • DAG 未安排执行。
    • DAG 处理器日志中存在错误,例如:
    dag-processor-manager [2023-04-21 21:10:44,510] {manager.py:1144} ERROR -
    Processor for /home/airflow/gcs/dags/dag-example.py with PID 68311 started
    at 2023-04-21T21:09:53.772793+00:00 has timed out, killing it.
    

    dag-processor-manager [2023-04-26 06:18:34,860] {manager.py:948} ERROR -
    Processor for /home/airflow/gcs/dags/dag-example.py exited with return
    code 1.
    
  • DAG 处理器遇到问题,导致 Airflow 调度器重启。

  • 安排执行的 Airflow 任务被取消,未能解析的 DAG 的 DAG 运行作业可能会标记为 failed。例如:

    airflow-scheduler Failed to get task '<TaskInstance: dag-example.task1--1
    manual__2023-04-17T10:02:03.137439+00:00 [removed]>' for dag
    'dag-example'. Marking it as removed.
    

解决方案

  • 增加与 DAG 解析相关的参数:

  • 更正或移除导致 DAG 处理器出现问题的 DAG。

检查 DAG 解析时间

如需验证问题是否发生在 DAG 解析时间,请执行以下步骤。

控制台

在 Google Cloud 控制台中,您可以使用监控页面和 日志标签页检查 DAG 解析时间。

使用 Managed Service for Apache Airflow 监控页面检查 DAG 解析时间:

  1. 在 Google Cloud 控制台中,前往环境 页面。

    [前往“环境”][console-list-env]

  2. 在环境列表中,点击您的环境名称。 监控 页面随即打开。

  3. Monitoring 标签页中,选择 DAG 统计信息 ,然后查看所有 DAG 文件的总解析时间 图表,以找出可能的问题。 我们建议您监控此图表一段时间,以便在多个 DAG 解析周期内找出 DAG 解析问题。

    “监控”标签页上会显示“所有 DAG 文件的总解析时间”

使用 Managed Service for Apache Airflow 日志 标签页检查 DAG 解析时间:

  1. 在 Google Cloud 控制台中,前往环境 页面。

    [前往“环境”][console-list-env]

  2. 在环境列表中,点击您的环境名称。 监控 页面随即打开。

  3. 前往日志 标签页,然后从所有日志 导航树中选择 DAG 处理器管理器 部分。

  4. 查看 dag-processor-manager 日志,找出可能的问题。

    DAG 处理器日志将显示 DAG 解析时间

gcloud

使用 dags report 命令可查看所有 DAG 的解析时间。

gcloud composer environments run ENVIRONMENT_NAME \
    --location LOCATION \
    dags report

  • ENVIRONMENT_NAME 替换为环境的名称。
  • LOCATION 替换为环境所在的区域。

该命令的输出类似于以下内容:

file                  | duration       | dag_num | task_num | dags
======================+================+=========+==========+===================
/manydagsbig.py       | 0:00:00.038334 | 2       | 10       | serial-0,serial-0
/airflow_monitoring.py| 0:00:00.001620 | 1       | 1        | airflow_monitoring

查找表中列出的每个 DAG 的 duration 值。 如果值较大,则可能表示某个 DAG 未以最佳方式实施。从输出表中,您可以确定哪些 DAG 的解析时间较长。

DAG 解析时排查问题

以下部分介绍了 DAG 解析时一些常见问题的症状和可能的修复。

受限线程数量

仅允许 DAG 处理器使用有限数量的线程可能会影响您的 DAG 解析时间。

如需解决此问题,请替换 [scheduler]parsing_processes Airflow 配置选项。将初始值设置为调度器使用的 vCPU 数量减去 1 个 CPU。例如,如果调度器使用 2 个 vCPU,请将此值设置为 1。然后调整调度器资源分配,使其以约 70% 的 vCPU 或内存容量运行。

让 DAG 处理器忽略不必要的文件

您可以通过跳过 DAGs 文件夹中的不必要文件来提高 Airflow DAG 处理器(在 Managed Airflow(第 2 代)中与 Airflow 调度器一起运行)的性能。Airflow DAG 处理器会忽略 .airflowignore 文件中指定的文件和文件夹。

如需让 Airflow DAG 处理器忽略不必要的文件,请执行以下操作:

  1. 创建 .airflowignore 文件。
  2. 在此文件中,列出应忽略的文件和文件夹。
  3. 将此文件上传到环境的存储桶中的 /dags 文件夹。

如需详细了解 .airflowignore 文件格式,请参阅 Airflow 文档

Airflow 进程暂停 DAG

您可以暂停 DAG 以停止其运行。这样可以节省 Airflow 工作器的资源。

Airflow DAG 处理器会继续解析已暂停的 DAG。如果您想要提高 DAG 处理器的性能,请使用.airflowignore 或从 DAGs 文件夹中删除已暂停的 DAG。

常见问题

以下部分介绍了一些常见解析问题的症状和可能的修复。

DAG 加载导入超时

具体情况:

  • 在 Airflow 网页界面中,DAG 列表页面顶部出现一个红色提醒框,其中显示 Broken DAG: [/path/to/dagfile] Timeout
  • 在 Cloud Monitoring 中:airflow-scheduler 日志包含类似于以下内容的条目:

    • ERROR - Process timed out
    • ERROR - Failed to import: /path/to/dagfile
    • AirflowTaskTimeout: Timeout

修复:

替换 dag_file_processor_timeout Airflow 配置选项,并留出更多时间来进行 DAG 解析:

部分
core dag_file_processor_timeout 新超时值

DAG 在 Airflow 界面或 DAG 界面中不可见,并且调度器不会对其进行调度

DAG 处理器会解析每个 DAG,之后调度器才能对这些 DAG 进行调度 并且 DAG 才能在 Airflow 界面DAG 界面中显示。

以下 Airflow 配置选项定义了用于解析 DAG 的超时:

如果 DAG 在 Airflow 界面或 DAG 界面中不可见:

  • 检查 DAG 处理器日志,了解 DAG 处理器是否能够正确处理您的 DAG。如果出现问题,您可能会在 DAG 处理器或调度器日志中看到以下日志条目:

    [2020-12-03 03:06:45,672] {dag_processing.py:1334} ERROR - Processor for
    /usr/local/airflow/dags/example_dag.py with PID 21903 started at
    2020-12-03T03:05:55.442709+00:00 has timed out, killing it.
    
  • 检查调度器日志,了解调度器是否正常运行。如果出现问题,您可能会在调度器日志中看到以下日志条目:

    DagFileProcessorManager (PID=732) last sent a heartbeat 240.09 seconds ago! Restarting it
    Process timed out, PID: 68496
    

解决方案

  • 修复所有 DAG 解析错误。DAG 处理器会解析多个 DAG,在极少数情况下,一个 DAG 的解析错误可能会对其他 DAG 的解析产生负面影响。

  • 如果解析 DAG 所需的时间超过 [core]dagbag_import_timeout中定义的秒数,请增加此超时。

  • 如果解析所有 DAG 所需的时间超过 定义 在 [core]dag_file_processor_timeout中的秒数,请增加此超时。

  • 如果 DAG 解析时间过长,也可能意味着它未以最佳方式实施。例如,如果它读取许多环境变量,或者对外部服务或 Airflow 数据库执行调用。请尽可能避免在 DAG 的全局部分执行此类操作。

  • 增加调度器的 CPU 和内存资源,以便其能够更快地运行。

  • 调整调度器的数量

  • 增加 DAG 处理器进程的数量,以便更快地完成解析。您可以通过增加 [scheduler]parsing_processes的值来实现此目的。

  • 降低 DAG 解析的频率

  • 降低 Airflow 数据库的负载

后续步骤