【发布时间】:2011-01-20 03:10:11
【问题描述】:
在与 Google 的一位朋友交谈后,我想实现某种 Job/Worker 模型来更新我的数据集。
此数据集反映了 3rd 方服务的数据,因此,要进行更新,我需要对其 API 进行多次远程调用。我认为将花费大量时间等待来自此第 3 方服务的响应。我想加快速度,并更好地利用我的计算时间,通过并行化这些请求并同时保持其中许多请求处于打开状态,因为它们等待各自的响应。
在我解释我的具体数据集并解决问题之前,我想澄清一下我正在寻找什么答案:
- 这是一个非常适合与 MapReduce 并行化的流程吗?
- 如果是,在 Amazon 的 mapreduce 模块上运行是否具有成本效益,该模块按小时计费,并在作业完成时向上取整? (我不确定究竟什么才是“工作”,所以我不知道具体是如何计费的)
- 如果否,我应该使用其他系统/模式吗? 和是否有库可以帮助我在 python 中执行此操作(在 AWS 上,使用 EC2 + EBS)?
- 您认为我设计此工作流程的方式有什么问题吗?
好的,现在进入细节:
数据集由拥有最喜欢项目和关注其他用户的用户组成。目的是能够更新每个用户的队列——用户在加载页面时将看到的项目列表,基于她关注的用户最喜欢的项目。但是,在我处理数据和更新用户队列之前,我需要确保我拥有最新的数据,这是 API 调用的来源。
我可以拨打两个电话:
- Get Followed Users -- 返回被请求用户关注的所有用户,以及
- Get Favorite Items -- 返回所请求用户的所有最喜欢的项目。
在我为正在更新的用户调用获取关注的用户之后,我需要为每个被关注的用户更新最喜欢的项目。只有当所有被关注用户的所有收藏都返回时,我才能开始处理该原始用户的队列。这个流程看起来像:
此流程中的工作包括:
- 为用户启动更新队列 -- 通过获取用户,然后更新用户,存储他们,然后为每个用户创建 Get Favorites 作业来启动该过程。
- 为用户获取收藏夹 -- 从 3rd 方服务请求并存储指定用户的收藏夹列表。
- 为用户计算新队列 -- 处理一个新队列,现在所有数据都已获取,然后将结果存储在应用程序层使用的缓存中。
所以,我的问题是:
- 这是一个非常适合与 MapReduce 并行化的流程吗?我不知道它是否能让我启动 UserX 的流程,获取所有相关数据,然后只有在这一切都完成后才返回处理 UserX 的队列。
- 如果是,在 Amazon 的 mapreduce 模块上运行是否具有成本效益,该模块按小时计费,并在作业完成时向上取整?如果我使用他们的模块,我可以等待开放 API 请求的“线程”数量是否有限制?
- 如果否,我应该使用其他系统/模式吗? 和是否有库可以帮助我在 python 中执行此操作(在 AWS 上,使用 EC2 + EBS?)?
- 您认为我设计此工作流程的方式有什么问题吗?
感谢阅读,期待与大家讨论。
编辑,回应 JimR:
感谢您的中肯答复。自从我写了原始问题以来,在我的阅读中,我已经远离使用 MapReduce。我还没有确定我想如何构建它,但是当我真的只是想并行化 HTTP 请求时,我开始觉得 MapReduce 更适合分配/并行化计算负载。
我的“减少”任务,即获取所有获取的数据并将其处理成结果的部分,并不是计算密集型的。我很确定它最终会成为一个大型 SQL 查询,每个用户执行一两秒钟。
所以,我倾向于:
- 一个非 MapReduce Job/Worker 模型,用 Python 编写。我的一个 Google 朋友让我为此学习 Python,因为它的开销低且可扩展性好。
- 使用 Amazon EC2 作为计算层。我认为这意味着我还需要一个 EBS 切片来存储我的数据库。
- 可能使用亚马逊的简单消息队列。听起来这第 3 个亚马逊小部件旨在跟踪作业队列、将结果从一个任务移动到另一个任务的输入并优雅地处理失败的任务。它非常便宜。可能值得实施而不是自定义作业队列系统。
【问题讨论】:
-
我使用谷歌应用引擎来处理高度并行的请求和近乎实时的处理这类问题。 MapReduce 的启动和作业周期开销比我预期的要高得多。
-
有趣。我知道应用程序引擎可以使用 python,这是我一直致力于编写这些工作的,但我不清楚我将如何使用 GAE。我不熟悉 GAE 的工作原理,也不熟悉如何表达这个问题,所以我找不到答案。你还有其他我应该在这里研究的资源吗?感谢您的提示!
-
我实际上写了一个 python 进程,它使用线程和队列来进行并行 Web 请求和数据处理。它工作得很好,但我对 python 编程或线程并不“完全精通”,以使其真正可靠或表现良好。经过大量的谷歌搜索、一些挫折和其他需要优先处理的任务 - 我放弃了它的工作。我可能会再捡起来。我对使用 MapReduce 得出了类似的结论,因为除了 hadoop 内置的并行性之外,我不会真正利用任何东西。无论如何,如果您想更多地讨论它的方法和解决方案,请 lmk!
-
我想我只是要构建一些东西,看看它是否有效。完成了足够的研究并获得了足够的图片,我认为这将起作用,无论哪种方式,我更感兴趣的是完成一些事情,而不是在这一点上构建适当的解决方案。
标签: python amazon-web-services parallel-processing mapreduce