如何修复任务在气流中收到 SIGTERM 信号
修复 Apache Airflow 任务中的 SIGTERM 信号

Introduction
虽然我最近一直致力于将 DAG 从 Airflow 1 (v1.10.15) 迁移到 Airflow 2 (v2.2.5),但我花了很多时间试图找出一些 DAG 出现的错误一点信息都没有。
WARNING airflow.exceptions.AirflowException: Task received SIGTERM signal
INFO - Marking task as FAILED.
尽管我花了一些时间尝试了我在网上找到的可能的解决方案,但似乎没有一个对我有用。
在今天的文章中,我将介绍一些针对发送到任务的 SIGTERM 信号导致 Airflow DAG 失败的潜在解决方案。根据您的配置和您的特定用例,不同的解决方案可能对您有用,因此请务必仔细检查每个建议的解决方案并进行尝试。
DAG run timeout
您的任务收到 SIGTERM 信号的原因之一是由于 dagrun_timeout 值较短。 DAG 类采用此参数,该参数用于指定 DagRun 在超时/失败之前应该运行多长时间,以便可以创建新的 DagRun。请注意,超时仅对计划的 DagRuns 强制执行。
对于包含许多长时间运行任务的 DAG,可能会超过 dagrun_timeout,因此正在运行的任务将收到 SIGTERM 信号,这样 DAG 就会失败并执行新的 DagRun。
您可以在 Airflow UI 上检查 DagRun 的持续时间,如果您观察到这大于创建 DAG 实例时指定的 dagrun_timeout 值,则可以根据您的具体用例将其增加到合理的时间量。
请注意,此配置适用于 DAG,因此您需要提供一个值,以便有足够的时间让 DAG 中包含的所有任务运行。
from datetime import datetime, timedeltafrom airflow.models.dag import DAG
with DAG(
'my_dag',
start_date=datetime(2016, 1, 1),
schedule_interval=' 0 * * * * ',
dagrun_timeout=timedelta(minutes=60),
) as dag:
...
内存不足
另一种可能是当前运行 Airflow Task 的机器内存不足。根据您部署 Airflow 的方式,您可能需要检查工作人员的内存使用情况并确保他们确实有足够的内存。
例如,如果您的部署在云端,您可能需要检查是否有任何 Kubernetes pod 被驱逐。 Pod 通常由于资源匮乏的节点而被驱逐,因此这可能是您的 Airflow 任务收到 SIGTERM 信号的原因。
元数据数据库耗尽 CPU
另一个可能导致 Airflow 任务接收 SIGTERM 信号的常见问题是元数据数据库上的 CPU 使用率。
默认情况下,Airflow 使用 SQLite,它仅用于开发目的,但它旨在支持 PostgreSQL、MySQL 或 MSSQL 的数据库后端。
数据库的 CPU 使用率有可能达到 100%,这可能是您的 Airflow 任务收到 SIGTERM 信号的原因。如果是这种情况,那么您应该考虑增加默认设置为 5 秒的 job_heartbeat_sec 配置(或 AIRFLOW__SCHEDULER__JOB_HEARTBEAT_SEC 环境变量)的值。
job_heartbeat_sec
任务实例侦听外部终止信号(当您从 CLI 或 UI 清除任务时),这定义了它们应该侦听的频率(以秒为单位)。
– Airflow Documentation[0]
在 Airflow 配置文件 airflow.cfg 中,确保在调度程序部分下指定此配置,如下图所示。
[scheduler]
job_heartbeat_sec = 20
或者,您可以通过相应的环境变量修改此配置的值:
export AIRFLOW__SCHEDULER__JOB_HEARTBEAT_SEC=20
如果数据库级别的 CPU 消耗是一个问题,那么增加上述配置现在应该会显着降低 CPU 使用率。
Disable “Mini Scheduler”
默认情况下,任务主管进程会尝试调度同一 Airflow DAG 的更多任务,以提高性能并最终帮助 DAG 在更短的时间内执行。
此行为是通过默认为 True 的 schedule_after_task_execution 配置的。
schedule_after_task_execution
任务主管进程是否应该执行“迷你调度程序”来尝试调度同一 DAG 的更多任务。保留此选项将意味着同一 DAG 中的任务执行得更快,但在某些情况下可能会饿死其他 dag。
– Airflow Documentation[0]
由于 Airflow 中的错误,任务被 LocalTaskJob 心跳杀死的机会非常高。因此,一种可能的解决方案是简单地禁用迷你调度程序。[0]
在您的 Airflow 配置文件 airflow.cfg 中,您需要将 schedule_after_task_execution 设置为 False。
[scheduler]
schedule_after_task_execution = False
或者,可以通过 AIRFLOW__SCHEDULER__SCHEDULE_AFTER_TASK_EXECUTION 环境变量覆盖此配置:
export AIRFLOW__SCHEDULER__SCHEDULE_AFTER_TASK_EXECUTION=False
如果这是您的问题,那么您可能还需要考虑将 Airflow 升级到已修复此错误的版本。
Final Thoughts
在今天的教程中,我们讨论了 SIGTERM 信号的含义,该信号可以偶尔发送到 Airflow 任务,导致 DAG 失败。我们讨论了可能发生这种情况的几个潜在原因,并根据您的具体用例展示了如何克服这个问题。
请注意,您的配置也有可能遇到本教程中讨论的多个问题,因此您可能必须应用我们今天讨论的解决方案组合才能摆脱 SIGTERM 信号。
成为会员并阅读 Medium 上的每个故事。您的会员费直接支持我和您阅读的其他作家。您还可以完全访问 Medium 上的每个故事。[0]
您可能还喜欢的相关文章