澄清Hadoop与RabbitMQ + Celery的用例

时间:2013-08-29 21:23:34

标签: python hadoop rabbitmq celery distributed-computing

我知道有类似的问题,例如:

但是我问这个是因为我正在寻找一个更具体的区别,有几个用例可以支持。

所以,我是一个python用户,想要制作两个/两个的程序:

  1. 太大了
  2. 花太长时间
  3. 在一台计算机上执行,并在多台计算机上处​​理它们。我熟悉python中的(单机)多处理软件包,我现在正在编写mapreduce样式代码。我知道我的功能很容易并行化。

    在询问我常见的智能CS建议提供者时,我的问题是:

    “我想接受一项任务,将其分成一堆在一堆机器上同时执行的子任务,然后将这些结果聚合并根据其他一些功能处理,这可能是一个减少,或者例如,可以是串行添加到数据库的指令。“

    根据我的用例的分解,我认为我同样可以使用Hadoop或一组Celery工作者+ RabbitMQ经纪人。然而,当我问圣人的建议提供者时,他们回应我,好像我完全疯狂地将Hadoop和Celery视为可比较的解决方案。我已经阅读了很多关于Hadoop的内容,以及关于Celery的内容---我认为我对这两者的作用非常了解 - 我似乎不理解的是:

    1. 为什么他们被认为是如此独立,如此不同?
    2. 鉴于他们似乎被接受为完全不同的技术---以什么方式?有哪些用例可以区分一个用户,哪个用户更好?
    3. 两者都可以解决哪些问题,哪一方面使用其中一个特别愚蠢?
    4. 是否有更好,更简单的方法来实现多处理 - 如Pool.map() - 多台机器的功能?让我们假设我的问题不受存储限制,而是受到计算所需的CPU和RAM的限制,因此没有太大的空间来保存从工作者返回的结果。 (也就是说,我正在做类似模拟的事情,我需要在数据库中的值中播种的较小机器上生成很多东西,但这些内容在返回到源机器/数据库之前会被减少。)
    5. 我理解Hadoop是大数据标准,但Celery也看起来很受支持;我感谢它不是java(流式API python必须用于hadoop看起来对我不舒服),所以我倾向于使用Celery选项。

1 个答案:

答案 0 :(得分:23)

  1. 它们是相同的,因为可以解决您描述的问题(map-reduce)。它们的不同之处在于,Hadoop完全构建为仅解决该用例并构建Celey / RabbitMQ以便使用消息传递在不同节点上执行Task执行。芹菜也支持不同的用例。

  2. Hadoop通过拥有一个庞大而特殊的文件系统来解决map-reduce问题,映射器从中获取数据,将其发送到一堆映射节点并将其减少到该文件系统。这样做的好处是它可以很快地完成这项工作。缺点是它只能在基于文本的数据输入上运行,Python实际上不受支持,如果你不能(略微)不同的用例。 Celery是一个基于消息的任务执行器。在其中,您可以在工作流(可以是map-reduce工作流程)中定义任务并将它们组合在一起。它的优点是它是基于python的,你可以在自定义工作流程中将任务拼接在一起。缺点是它依赖于单个经纪人/结果后端及其设置时间。

  3. 因此,如果您有几个Gb的日志文件并且不关心用Java编写并且有一些专门用于运行Hadoop的服务器,请使用它。如果您希望灵活地运行工作流程任务,请使用Celery。或.....

  4. 是的!来自其中一家公司的新项目帮助创建了RabbitMQ(和其他公司)使用的消息传递协议AMQP。它被称为ZeroMQ,与Celery相比,它通过奇怪地降低抽象级别将分布式消息传递/执行提升到了一个新的水平。它定义了可以通过各种方式链接在一起的套接字,以在节点之间创建消息传递链接。您想要对这些消息做任何事都取决于您的编写。虽然这可能听起来像“套接字周围的薄包装有什么好处”,但它实际上处于正确的抽象层次。现在,在我们公司,我们正在考虑所有芹菜消息并用ZeroMQ重建它。我们发现Celery对于应该如何执行任务以及一般来说设置/配置是一种痛苦过于自以为是。中间那个必须处理所有流量的经纪人也成了很大的瓶颈。

  5. 恢复:

    • 使用尽可能少的编程和大量的设置/配置时间计算书中“the”的出现次数:Hadoop
    • 创建原子任务并能够让它们协同工作,而不需要太多的编程和大量的设置/配置时间:Celery
    • 完全控制如何处理您的消息以及如何使用几乎没有设置/配置时间对其进行编程:ZeroMQ
    • 没有设置/配置时间的痛苦:套接字