如何使用 Airflow 高效管理单机资源

How to efficiently manage resources on a single machine with Airflow

我是 运行 Airflow 进程,在配备 3.1 GHz Intel Core i7 处理器和 16GB 或 RAM 的 2015 年初 MacBook Pro 上执行 +400 个任务。

我 运行 的脚本看起来很像 this,区别在于我将 DAG 定义为

default_args = {
  'start_date': datetime.now(),
  'max_active_runs': 2
}

尽量避免同时触发太多任务。以下是我执行此操作的一系列屏幕截图。我的问题是:

  1. 此操作会生成大量 python 个进程。是否有必要以这种方式在 RAM 中定义整个任务队列,或者 airflow 是否可以采用“边走边生成任务”的方法来避免启动这么多进程。
  2. 我认为 max_active_runs 控制在任何给定时间有多少进程实际在工作。不过回顾我的任务,我将有数十个任务占用 CPU 资源,而其余任务则处于空闲状态。这真的很低效,我该如何控制这种行为?

下面是一些截图:

一切顺利开始,并行进程 运行 比我预期的要多得多:

一切都停滞不前,有很多空闲进程。事情似乎停滞不前:

终端开始吐出大量错误消息,并且有很多进程失败:

该过程基本上循环通过这些阶段,直到完成。最终的任务分解如下所示:

[2017-08-24 16:26:20,171] {jobs.py:2066} INFO - [backfill progress] | finished run 1 of 1 | tasks waiting: 0 | succeeded: 213 | kicked_off: 0 | failed: 200 | skipped: 0 | deadlocked: 0 | not ready: 0

有什么想法吗?

max_active_runs 定义 Airflow 将为每个 DAG 调度多少 运行s。根据您使用的执行器,执行器具有特定的容量。例如,对于最流行的 LocalExecutor,这是由并行度设置的。这是 LocalExecutor 应该 运行 的并发任务数。 如果要限制并行 运行 的数量,则应使用 pool.