Python中用于Map-Reduce的Celery或其他替代方案?

5 投票
2 回答
2922 浏览
提问于 2025-04-16 22:29

我有一些比较耗时的工作,非常适合用“映射-归约”模型来处理(简单来说,就是把几百个之前通过一些耗时算法计算出来的排名进行汇总)。

我想在集群上并行处理这些工作(不仅仅是多进程),所以我关注了两个实现:CeleryDisco。Celery 默认不支持简单的映射-归约,虽然“映射”部分可以通过 TaskSets 很容易地实现,但“归约”部分该怎么高效实现呢?

(我对 Disco 的问题是它不能在 Windows 上运行,而且我已经为程序的另一部分设置了 Celery,所以再用一个框架来做映射-归约感觉不太优雅。)

2 个回答

2

简单来说,你需要把一个任务的结果拿来当作另一个任务的输入。celery在这方面不太方便。

在celery的方式中,你可以有一个定时任务调度器,它会以异步的方式执行这些工作(也就是map部分),如果是在单台电脑上,它会保留任务的引用;如果是在多个地方,就把这个引用存到数据库后端(比如redis、mongo等)。你可能还需要一些调度器来收集这些结果,并把它们应用到reduce函数上。

我建议你在所有的集群上运行自己的python进程来处理map和reduce,并确保把结果存储在像redis这样的内存数据库中,同时用celery来执行map和reduce的任务。你的主进程会负责收集和合并这些结果。

撰写回答