4

我们使用 Amazon MWAA Airflow,很少有标记为“FAILED”的任务,但根本没有日志。好像容器在没有注意到我们的情况下被关闭了。

我找到了这个链接: https : //cloud.google.com/composer/docs/how-to/using/troubleshooting-dags#task_fails_without_emitting_logs 机器上的OOM对此进行了解释。但是我们的任务几乎没有使用 CPU 和 RAM。他们只对 AWS API 进行 1 次 HTTP 调用。所以很轻。

在 Cloudwatch 上,我可以看到没有其他任务在同一个容器上启动(DAG 运行通过打印容器 IP 开始,所以我可以在所有任务上搜索这个 IP)。

如果有人有想法,那就太好了,谢谢!

4

2 回答 2

3

MWAA 使用 ECS 作为后端,其工作方式是 ECS 将根据集群中运行的任务数量自动扩展工作人员的数量。对于小型环境,默认每个worker可以处理5个任务。如果有超过 5 个任务,那么它将扩展另一个工人,依此类推。

我们不对气流进行任何计算(批处理,长时间运行的工作),我们的 Dags 主要是对其他服务的 API 请求,这意味着我们的 Dags 运行速度很快并且寿命很短。有时,我们可以在很短的时间(几秒钟)内完成 8 个或更多任务。在这种情况下,自动缩放将触发向外扩展并将工作人员添加到集群中。然后,由于这些任务只是 API 请求,因此它会非常快速地执行并立即任务数量降至 0,从而触发缩减(删除工作人员)。如果在那个确切时刻安排了另一个任务,那么气流最终将在要删除的容器上运行该任务,并且您的任务将在中间被杀死而没有任何通知(竞争条件)。发生这种情况时,您通常会看到不完整的日志。

第一个解决方法是通过冻结集群中的工作人员数量来禁用自动缩放。您可以将最小值和最大值设置为适当的工作人员数量,这取决于您的工作量。我们同意,我们失去了服务的弹性。

$ aws mwaa update-environment --name MyEnvironmentName --min-workers 2 --max-workers 2

AWS 建议的另一种解决方案是始终运行一个虚拟任务(无限循环),这样您就永远不会在所有工作人员中进行扩展。

AWS 告诉我们,他们正在研究改进执行器的解决方案。

于 2021-05-12T19:02:14.077 回答
1

所以在尝试了各种事情之后,他们的 boto 包也存在并发问题,解决它的最简单方法是让事情不并发。

因此,使用只有 2 个 vcpus 的调度程序(按此)运行它们最小的实例大小将不会出现此问题。

另一件事是设置 celery.sync_parallelism = 1

如果您正在运行它们的中型或大型实例,两者都将解决没有日志的随机任务失败

于 2021-08-26T16:49:16.763 回答