Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
本页面介绍 Airflow 触发器常见问题和问题排查步骤和信息。
触发器中的阻塞操作
异步任务有时可能会在触发器中被阻塞。 在大多数情况下,问题源于触发器资源不足或自定义异步运算符代码存在问题。
触发器日志会显示任何警告消息,这些消息有助于您确定触发器性能下降的根本原因。有两类重要警告需要注意。
异步线程被阻塞
Triggerer's async thread was blocked for 1.2 seconds, likely due to the highly utilized environment.
此警告表示由于异步任务量过大而导致性能出现问题。
解决方案:如需解决此问题,请为触发器分配更多资源,减少同时执行的延迟任务数量,或增加环境中的触发器数量。 请注意,虽然触发器处理可延迟的任务,但工作器负责启动并最终完成每个任务。如果您要调整触发器的数量,请考虑同时伸缩工作器实例的数量。
特定任务阻塞了异步线程。
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 执行的特定一段运算符代码。根据设计,触发器应依赖
asyncio
库在后台运行操作。触发器的自定义实现可能无法正确遵守asyncio
合约(例如,由于在 Python 代码中错误使用了await
和async
关键字)。解决方案:检查警告中报告的代码,并检查异步操作是否已正确实现。
触发器过多
您可以在 task_count
指标中看到延迟任务的数量,该指标也会显示在环境的 Monitoring 信息中心内。每个触发器都会创建一些资源,例如与外部资源的连接,这些资源会消耗内存。

内存和 CPU 消耗量图表表明,资源不足会导致重启,因为活跃性探测因缺少心跳而失败:

解决方案:如需解决此问题,请为触发器分配更多资源,减少同时执行的延迟任务数量,或增加环境中的触发器数量。
在回调执行期间 Airflow 工作器崩溃
触发器完成执行后,控制权会返回给 Airflow worker,后者会使用执行槽运行回调方法。此阶段由 Celery 执行器控制,因此适用相应的配置和资源限制(例如 parallelism
或 worker_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 界面中查看环境中正在运行的所有触发器(需要 Admin
角色),方法是依次前往浏览 > 触发器页面。
解决方案:
- 再次启用触发器,然后等待延迟的任务完成。
- 访问 Airflow 数据库并手动删除不完整的触发器。
触发器停用后,任务仍处于延迟状态
当触发器被停用时,已处于推迟状态的任务会保持此状态,直到达到超时时限。此超时时间可以是无限的,具体取决于 Airflow 和 DAG 配置。
请使用以下任一解决方案:
- 手动将任务标记为失败。
- 使触发器能够完成任务。
仅当您的环境不运行任何延迟执行的运算符或任务,并且所有延迟执行的任务都已完成时,我们才建议您停用触发器。