有没有一个规范的问题可以用map / reduce来帮助?

时间:2010-08-05 05:10:48

标签: hadoop mapreduce apache-pig

我正在尝试理解hadoop和map / reduce的界限,这将有助于了解我们知道map / reduce无法帮助的非平凡问题或一类问题。

如果改变问题的一个因素可以简化map / reduce,那肯定会很有趣。

谢谢

5 个答案:

答案 0 :(得分:6)

我想到了两件事:

  1. 任何需要实时/交互/低延迟响应时间的内容。提交给Hadoop的任何工作都会产生固定成本。

  2. 任何不是embarrassingly parallel的问题。 Hadoop可以处理许多需要数据之间简单相互依赖的问题,因为记录在reduce阶段加入。但是,某些图形处理和机器学习算法很难在Hadoop中编写,因为有太多的操作彼此依赖。一些机器学习算法需要非常低的延迟,随机访问大量数据,而Hadoop并不提供开箱即用的功能。

答案 1 :(得分:2)

“我们知道map / reduce无法协助”并不完全清楚你的意思。其他答案似乎满足于一些例子,如果使用map reduce来获得一些显着的加速并不是微不足道,容易或不太困难,但对于其他人来说,容易对其他人来说很容易。 我个人会对一个说不能做某事的定理感到更满意。如果我们看一下计算复杂性,就会有一类难以并行化的问题,P完全问题。众所周知的这类问题是无上下文语法识别(对编译器很重要),线性编程和压缩中的一些问题。维基百科条目有更多。

有些人正在为map reduce编制新的复杂性类。我非常怀疑,但是陪审团对这些将会有多大帮助。

另一个问题是:我们可以在map reduce中模拟任何并行算法吗?当然,我们无法映射减少我们超越P完全问题的方式,但也许有一些问题可以并行解决,但不能在mapreduce中解决。我不知道有任何这样的问题,但我知道一篇指向相反方向的论文,尽管有些假设 “在MapReduce框架中模拟并行算法并应用于并行计算几何”作者:Michael T. Goodrich

在实践中,我们很少有时间在地图缩小方式中思考并开发特定于此模型的算法技术,并且我发现新的问题落在地图上减少了解决方案。当尘埃落定时,我们可能会发现mapreduce比最初看起来更有力量。

答案 2 :(得分:0)

我认为任何无法解决divide and conquer的问题都不会对hadoop有效。如果可以修改算法以便能够创建子任务,那么我猜它可以在hadoop下运行。

要添加到您的问题(而不是答案,我是否将此部分作为评论?),如果有可以将问题细分的子任务怎么办,但没有明确的方法来执行{{1 hadoop阶段?我想仍然可以在filter阶段使用hadoop并在一台机器上进行缩减。

答案 3 :(得分:0)

正如其他人所说:问题必须易于分割成可以独立处理的部分。

所以,让我举两个我作为WebAnalytics架构师的例子(实际上我正在尝试做Hadoop现在提供的...没有hadoop ...在具有多个CPU核心的单个系统上使用bash shell脚本)。我希望这两个能让你对这些边界在reallife中的样子有所了解。

上下文:

假设你有一大群人  来自网络服务器的日志。你呢  想分析一下这种行为  游客。你需要一个属性  可靠地告诉你哪个请求  由哪个用户完成。

我的两个例子:

  1. 您想要用来关联行为的属性在某些部分是不好的(比方说:sessionid)。如果网站使用JavaScript(YUCK!)放置此因素,通常会发生这种情况。然后变得非常困难(根据我的经验:几乎不可能)来划分纠正这种相关属性的工作。这“必须”在“一个单独的巨大分区”中完成,因此MapReduce无法帮助你。
  2. 现在,将所有数据切换为可管理块所需的属性是可靠的(即,单个浏览器在网站上执行的所有操作),创建大量数据子集变得非常容易。您可以轻松地将大型站点的处理扩展到数百个系统。
  3. 过去曾有人告诉我,流体动力学方程(Navier-Stokes)不能分为“Mapreducable”部分。虽然我确实看到了为什么会出现这种情况的一些逻辑(流体的每个部分都会影响流体的其他部分);我应该说清楚,我甚至都不会试图理解这些方程式。

    我希望这些例子可以帮助你找到边界。

答案 4 :(得分:0)

对Gangadhar的回应(抱歉,评论栏中没有足够的空间):

我喜欢你对分而治之的回应,但我有一点需要补充。 Mapreduce不能很好地处理除法和征服算法的递归方面,因为某些d / c算法的子问题组合取决于最终减少到一个键。以merge sort algorithm为例(由于其Mapreduce实现的键排序属性,忽略了Hadoop中的排序是微不足道的):您将使用映射器将数据分区为两个块,使用任意id一把钥匙。您的reduce阶段会将各自键的值列表合并在一起。

7 3 2 4 1 5 8 9 would map to 
1->[[7],[3]] 2->[[2],[4]] 3->[[1],[5]] 4->[[8],[9]] would reduce to
3,7 2,4 1,5 8,9 would map to 
1->[[3,7],[2,4]] 2->[[1,5],[8,9]] 
etc.

您会看到键的数量减少了两个(或者您用于d / c算法的任何分块因子),并且最终应该归结为排序列表的一个键。这对于并行性是不好的。

因此,对于mapreduce来说,分而治之的鸿沟显然是必要的,但我们在征服阶段也需要数据并行,这样你的结果就是数据并行项的一些集合。 FFT是一种很好的分裂和征服算法的例子,可以很好地与mapreduce一起使用。