Airflow 触发器问题排查

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

本页面介绍 Airflow 触发器常见问题和问题排查步骤和信息。

触发器中的阻塞操作

异步任务有时可能会在触发器中被阻塞。在大多数情况下,问题源自触发器资源不足或自定义异步运算符代码存在问题。

触发器日志会显示任何警告消息,这些消息可帮助您找出导致触发器性能下降的根本原因。请注意以下两个重要警告。

  1. 异步线程被阻塞

    Triggerer's async thread was blocked for 1.2 seconds, likely due to the highly utilized environment.
    

    此警告表示由于异步任务数量较多,导致性能出现问题。

    解决方案:如需解决此问题,请向触发器分配更多资源、减少同时执行的延迟任务数量,或增加环境中的触发器数量。请注意,虽然触发器会处理可推迟的任务,但工作器负责启动和最终完成每个任务。如果您调整触发器的数量,不妨考虑同时扩缩工作器实例的数量

  2. 某项特定任务阻塞了异步线程。

    WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done, defined at /opt/***/***/jobs/my-custom-code.py:609> result=None> took 0.401 second
    

    此警告指向 Cloud Composer 执行的特定 Operator 代码。触发器在设计上应依赖于 asyncio 库在后台运行操作。触发器的自定义实现可能无法正确遵循 asyncio 协定(例如,由于在 Python 代码中错误使用 awaitasync 关键字)。

    解决方案:检查警告报告的代码,并检查异步操作是否已正确实现。

触发器过多

推迟的任务数量显示在 task_count 指标中,该指标也会显示在环境的 Monitoring 信息中心内。每个触发器都会创建一些资源(例如与外部资源的连接),这些资源会消耗内存。

Monitoring 信息中心中显示的推迟任务
图 1. Monitoring 信息中心上显示的延迟任务(点击可放大)

内存和 CPU 用量图表表明,由于心跳丢失导致活跃性探测失败,因此资源不足会导致重启:

触发器因资源不足而重启
图 2. 触发器因资源不足而重启(点击可放大)

解决方案:如需解决此问题,请向触发器分配更多资源、减少同时执行的延迟任务数量,或增加环境中的触发器数量

回调执行期间 Airflow 工作器崩溃

触发器执行完毕后,控制权会返回给 Airflow 工作器,后者会使用执行槽运行回调方法。此阶段由 Celery 执行器控制,因此会应用相应的配置和资源限制(例如 parallelismworker_concurrency)。

如果回调方法在 Airflow 工作器中失败,工作器失败,或者运行该方法的工作器重启,则任务会被标记为 FAILED。在这种情况下,重试操作会重新执行整个任务,而不仅仅是回调方法。

触发器中存在无限循环

您可以实现自定义触发器运算符,使其完全阻塞主触发器循环,以便一次只执行一个损坏的触发器。在这种情况下,系统会在有问题的触发器运行完毕后在触发器日志中生成警告

找不到触发器类

由于 DAG 文件夹未与 Airflow 触发器同步,因此在执行触发器时,内嵌的触发器代码会缺失。失败任务的日志中会生成以下错误:

ImportError: Module "PACKAGE_NAME" does not define a "CLASS_NAME" attribute/
class

解决方案从 PyPI 导入缺少的代码

Airflow 界面中关于触发器的警告消息

在某些情况下,停用触发器后,您可能会在 Airflow 界面中看到以下警告消息:

The triggerer does not appear to be running. Last heartbeat was received
4 hours ago. Triggers will not run, and any deferred operator will remain
deferred until it times out or fails.

Airflow 可能会显示此消息,因为 Airflow 数据库中仍有未完成的触发器。此消息通常表示触发器在您的环境中完成所有触发器之前已停用。

您可以前往 Airflow 界面中的 Browse > Triggers 页面,查看在该环境中运行的所有触发器(需要具有 Admin 角色)。

解决方案

停用触发器后,任务仍处于延迟状态

停用触发器后,已处于推迟状态的任务会一直保持此状态,直到超时为止。此超时时间可以是无限的,具体取决于 Airflow 和 DAG 配置。

请使用以下任一解决方案:

  • 手动将任务标记为失败。
  • 启用触发器以完成任务。

我们建议您仅在环境中不运行任何延迟操作符或任务且所有延迟任务均已完成时停用触发器。

后续步骤