澄清Hadoop与RabbitMQ + Celery的用例

Mit*_*ops 20 python hadoop distributed-computing rabbitmq celery

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

但我问这个问题是因为我正在寻找一个更具特色的区别,请用几个用例来支持.

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

  1. 太大了
  2. 花太长时间

在一台机器上完成,并在多台机器上处理它们.我熟悉python中的(单机)多处理软件包,我现在正在编写mapreduce样式代码.我知道我的功能很容易并行化.

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

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

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

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

我知道Hadoop是大数据标准,但Celery也看起来很受支持; 我感谢它不是java(流式API python必须用于hadoop看起来对我不舒服),所以我倾向于使用Celery选项.

Ric*_*kyA 24

  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对于应该如何执行任务以及一般来说设置/配置是一种痛苦过于自以为是.中间那个必须处理所有流量的经纪人也成了很大的瓶颈.

恢复:

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