Celery 是像 PBS、MESOS 或 YARN 那样的 "real" 调度器吗?

Is Celery a "real" scheduler like PBS, MESOS or YARN?

我有一个正在使用 Celery 的现有应用程序。

客户向 Celery 提交任务,Celery 的工作人员将这些任务和 运行 拆开,跨越不同的物理主机。

每个 Celery worker 运行 一次完成一项任务。给定的物理主机有多个工作器。

我们的任务可能有不同的资源需求。一个任务可能需要(1 个 CPU 和 5GB RAM),另一个(1 个 CPU 和 20GB RAM)才能工作,依此类推。

问题是 Celery 仅由一个简单的生产者-消费者系统支持,在给定时间,我遇到某些任务因内存不足错误而终止的情况。这是因为 worker 任务使用的总 RAM 优于物理主机总内存。事实上,工作人员在没有关于消耗和可用资源的任何特定情报的情况下拆分任务。

一个解决方案可能是对每个工作人员正在执行的任务设置内存限制 运行。问题是工人是静态初始化的,而我的任务没有静态要求。所以恐怕最终会造成资源浪费

我以前用过很多调度器(YARN,PBS,MESOS,..),动态工作负载(动态任务需求)很方便,因为你可以定义CPU/RAM需求您提交的每个任务。调度程序的作用是确保其动态分配的容器不会过度使用物理内存。

所以有两种可能性:要么 Celery 只是一个任务队列而不是真正的调度程序,因此它不是我想做的事情的错误工具,要么我错过了一些有用的 Celery 选项来做我想做的事情?

非常感谢

Celery 不会以您想要的方式做您想要的。

但是,这并不意味着您不能使用 Celery 做到这一点。如果您的 taskX 需要 4 核和 12G RAM,您可以做的(实际上我们就是这样做的)有一个名为“taskx_q”的队列并拥有服务器(AWS EC2 实例有 4 个核和 ~12G RAM) 运行 celery 作为服务 (systemd) 订阅了这个特定的队列,并发设置为 1。是的,它需要一些编码来实现良好的自动缩放(自动缩放组可以提供帮助),但这并不困难。