我知道也有类似的问题,比如:
https://stackoverflow.com/questions/8232194/pros-and-cons-of-celery-vs-disco-vs-hadoop-vs-other-distributed-computing-packag
区分celery 、酸菜、酸菜和rabbitmq/ironmq
但我问这个问题是因为我在寻找一个更特殊的区别,并辅以几个用例示例。
所以,我是一个python用户,他想制作一个或两个程序:
都太大了
时间太长了
在一台机器上执行,并在多台机器上处理它们。我熟悉python中的(单机)多处理包,我现在正在编写mapreduce风格的代码。例如,我知道我的函数很容易并行化。
在问我通常的聪明的cs建议者时,我的问题措辞如下:
“我想把一个任务,分成一堆子任务,这些子任务在一堆机器上同时执行,然后这些结果被聚合起来,并根据其他一些函数进行处理,例如,这些函数可以是reduce,也可以是串行添加到数据库中的指令。”
根据我的用例分解,我认为我同样可以很好地使用hadoop或一组celery 工人+rabbitmq代理。然而,当我向智者们提出建议时,他们的回答就好像我把hadoop和celery 当作可比的解决方案一样,简直是疯了。我读了很多关于hadoop的书,也读了一些关于celery 的书——我想我对两者的作用都有很好的理解——但我似乎不明白的是:
为什么他们被认为是如此分离,如此不同?
考虑到它们似乎被视为完全不同的技术——以什么方式?有哪些用例可以区分一个和另一个,或者对一个比另一个更好?
两种方法都能解决哪些问题?在哪些方面使用其中一种方法会特别愚蠢?
有没有更好、更简单的方法来实现多处理,比如pool.map()——多台机器的功能?假设我的问题不受存储的限制,而是受计算所需的cpu和ram的限制,因此没有太少的空间来保存从worker返回的结果的问题(也就是说,我在做一些类似于模拟的事情,我需要在较小的机器上生成很多东西,这些东西是由数据库中的一个值播种的,但是在它们返回到源机器/数据库之前,这些东西会减少。)
我知道hadoop是大数据标准,但是celery 看起来也很受支持;我很欣赏它不是java(python必须用于hadoop的流api让我觉得不舒服),所以我倾向于使用celery 选项。
1条答案
按热度按时间cbeh67ev1#
它们的相同之处在于两者都可以解决您描述的问题(map reduce)。它们的不同之处在于,hadoop的构建完全是为了解决这个用例,而celey/rabbitmq的构建则是为了方便使用消息传递在不同节点上执行任务。celery 也支持不同的用例。
hadoop通过拥有一个大而特殊的文件系统来解决map-reduce问题,Map器从中获取数据,将数据发送到一堆map节点,并将其缩减到该文件系统。这样做的好处是速度非常快。缺点是它只对基于文本的数据输入进行操作,python实际上不受支持,而且如果您不能(稍微)使用不同的用例。celery 是一个基于消息的任务执行器。在其中,您可以定义任务并将它们分组到一个工作流中(可以是map reduce工作流)。它的优点是基于python,可以在自定义工作流中将任务缝合在一起。缺点是它依赖于单个代理/结果后端及其设置时间。
所以,如果你有几个gb的日志文件,而不想用java编写,并且有一些专门用来运行hadoop的服务器可以使用。如果您想灵活地运行工作流任务,请使用celery 。或者。。。。。
对!其中一家公司的一个新项目帮助创建了rabbitmq(和其他公司)使用的消息传递协议amqp。它被称为zeromq,它将分布式消息传递/执行提升到了一个新的层次,与celery 相比,它在抽象层次上有一个奇怪的下降。它定义了可以以各种方式链接在一起的套接字,以便在节点之间创建消息传递链接。你想对这些信息做什么都由你来写。尽管这听起来像是“套接字周围的薄 Package 器有什么好处”,但实际上它处于正确的抽象级别。现在在我们公司,我们正在将所有celery 消息分解出来,并用zeromq重建它。我们发现celery 对于任务应该如何执行过于固执己见,而设置/配置通常是一个难题。同时,中间那个必须处理所有流量的代理也成为了一个瓶颈。
简历:
用尽可能少的编程和大量的设置/配置时间来计算书中“the”的出现次数:hadoop
创建原子任务,使它们能够与不太多的编程和大量的设置/配置时间协同工作:celery
完全控制如何处理消息以及如何在几乎没有设置/配置时间的情况下对它们进行编程:zeromq
没有设置/配置的痛苦时间:套接字