Cloud Composer 1 |Cloud Composer 2 |Cloud Composer 3
本页面提供了针对常见错误情况的问题排查步骤和信息 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 信息中心内。每个触发器
会创建一些资源,例如与外部资源的连接,
内存。
![Monitoring 信息中心中显示的推迟任务](https://cloud.google.com/static/composer/docs/images/composer-2-triggerer-running-and-queued-tasks.png?authuser=7&hl=zh-cn)
内存和 CPU 消耗图表表明资源不足会导致 因活跃性探测因缺少检测信号而失败而重启:
![触发器因资源不足而重启](https://cloud.google.com/static/composer/docs/images/composer-2-triggerer-restarts.png?authuser=7&hl=zh-cn)
解决方法:要解决此问题, 为触发器分配更多资源 减少同时执行的延迟任务的数量, 或增加您环境中的触发器数量。
Airflow 工作器在回调执行期间崩溃
触发器完成执行后,控件会返回给 Airflow
工作器,它使用执行槽运行回调方法。这一阶段
由 Celery Executor 控制,因此具有相应的配置和
适用资源限制(例如 parallelism
或 worker_concurrency
)。
如果 Airflow 工作器中的回调方法失败,则工作器失败,或者
运行该方法的工作器重启后,任务会被标记为 FAILED
。在
在这种情况下,重试操作会重新执行整个任务,而不仅仅是
回调方法。
触发器中的无限循环
实现自定义触发器运算符时可以采用 系统会完全阻止主触发器循环 错误。在此示例中,系统会在 会在触发器日志中生成 存在问题的触发器执行完毕。
找不到触发器类
由于 DAGs 文件夹未与 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 配置。
请使用以下任一解决方案:
- 手动将任务标记为失败。
- 请启用触发器以完成任务。
我们建议只有在您的环境不运行任何触发器时,才停用触发器 延迟的运算符或任务,所有延迟的任务都将完成。