Managed Airflow(第 3 代) | Managed Airflow(第 2 代) | Managed Airflow(旧版第 1 代)
本页面介绍了 Airflow 触发器的常见问题和问题排查步骤和信息。
触发器中的屏蔽操作
异步任务有时可能会在触发器中被屏蔽。 在大多数情况下,问题源于触发器资源不足或自定义异步运算符代码存在问题。
触发器日志会显示任何警告消息,这些消息有助于您找出触发器性能下降的根本原因。您需要注意以下两个重要警告。
Async thread blocked(异步线程被屏蔽):
Triggerer's async thread was blocked for 1.2 seconds, likely due to the highly utilized environment.此警告表示由于异步任务过多而导致性能出现问题。
解决方案:如需解决此问题,请执行以下操作:
- 调整触发器参数以 为触发器分配更多资源,或增加环境中的 触发器数量。
- 减少同时执行的推迟任务数量。
虽然触发器会处理可推迟的任务,但 Airflow 工作器负责启动并最终完成每个任务。如果您要 调整触发器的数量,请考虑同时 伸缩工作器实例的数量。
A specific task blocked the async thread(特定任务屏蔽了异步线程):
WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done, defined at /opt/***/***/jobs/example.py:609> result=None> took 0.401 second此警告指向由 Managed Service for Apache Airflow 执行的特定运算符代码。触发器在设计上依赖于
asyncio库在后台运行操作。触发器的自定义实现 可能无法正确遵循asyncio合约(例如,由于 在 Python 代码中错误使用了await和async关键字)。解决方案:检查警告报告的代码,并检查 异步操作是否已正确实现。
触发器过多
推迟任务的数量显示在 task_count 指标中,该指标也会显示在环境的 Monitoring 信息中心 内。每个触发器都会创建一些资源,例如与外部资源的连接,这些资源会消耗内存。
内存和 CPU 消耗量图表表明,资源不足会导致重启,因为活跃度探测失败,原因是缺少检测信号:
解决方案:如需解决此问题,请执行以下操作:
- 调整触发器参数以 为触发器分配更多资源,或增加环境中的 触发器数量。
- 减少同时执行的推迟任务数量。
回调执行期间 Airflow 工作器崩溃
触发器完成执行后,控制权会返回给 Airflow 工作器,该工作器会使用执行槽运行回调方法。此阶段由 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 配置。
请使用以下任一解决方案:
- 手动将任务标记为失败。
- 启用触发器以完成任务。
我们建议您仅在您的环境不运行任何推迟的运算符或任务,并且所有推迟的任务都已完成的情况下,停用触发器。