ECS Fargate 批处理作业任务通过气流在挂起状态等待时间过长

ECS Fargate batch job tasks via airflow waiting in pending state too long

我想 运行 并行处理 1000 个任务。这些是简短的 运行ning 批处理作业,它们使用相同的 taskdef(因此是相同的容器),只是传递的 args 不同(基本上传递的 arg 是从 0 到 999 的值)。 我使用气流在循环中调用 ECSOperator,就像这里解释的那样:
https://headspring.com/2020/06/17/airflow-parallel-tasks/.
当我在 AWS 中查看我的 ECS 集群的 'Tasks' 选项卡时,我看到排队的任务混合了 PROVISIONING、PENDING 和 运行。 运行 作业只是少数 - 大多数任务都处于 PENDING 状态,最终会进入 运行 状态。

问题:

  1. 为什么大多数作业都处于 PENDING 状态?他们在等什么(比如限制 运行 个职位?)?我如何检查它在此 PENDING 状态下正在做什么?
  2. 为什么 运行 职位很少?我怎样才能使大多数(如果不是全部)任务同时进入 运行 状态?使用 Fargate 时,可以同时 运行 多少个作业有一些限制吗?
  3. “服务”选项卡是空的——我没有配置任何服务——这不是只意味着长期运行宁jobs/daemons或者像我这样的批处理作业也可以利用它(并且达到同时获得所有 1000 个任务的目标 运行) ?
  4. 我没有在 'Capacity Providers' 选项卡中设置任何内容。这是否有助于将更多任务并行分配给 运行?
  5. 我不清楚此处自动缩放的概念 - Fargate 是否应该在需要时提供 1000 个 CPU,以便所有这些任务都可以 运行 并行?是否有默认限制?如果有,我该如何控制?

要解压的东西太多了。

1-2:需要考虑 TPS(每秒任务数)配置吞吐量。我们 (AWS) 正在更好地记录这些限制(我们今天没有这样做),但是对于 1000 个任务,考虑到可能需要“几分钟”才能将所有限制都包含在 运行 中状态。如果您看到他们需要“数小时”才能达到 运行 状态,那是不正常的。另请注意,每个 account/region 的默认值 concurrent task limit 为 1000(请不要将其与吞吐量混淆,您可以将其并发扩展至 1000 个 运行ning 任务)。

3:不。正如您所说,这只是用于控制循环,因此您可以说我总是想要 运行 n 个任务(或 DAEMONS),而 ECS 将执行此操作。您实际上是在使用管理任务的外部控制回路(气流)。这不会对吞吐量有任何影响。

4:没有(至少我不这么认为)。您可以试试 Airflow 是否支持使用 CP 启动任务而不是传统的“启动类型”模式。

5:自动缩放器(在 Fargate 的上下文中)几乎是一个 ECS 服务构造(参见第 3 点)。在那里你基本上说“我想 运行 在 n 和 m 任务之间,并且 scale-in/out 基于这些指标”。 ECS/Autoscaling 将使任务计数基于此波动。正如我所说,您正在单独执行所有这些外部启动任务。如果 Airflow 说“启动 1000 个任务”,则没有自动缩放……只是急于从 0 到 1000(参见#1 和#2)。