【发布时间】:2025-12-05 00:50:01
【问题描述】:
我正在尝试了解 hadoop 和 map/reduce 的界限,这将有助于了解我们知道 map/reduce 无法解决的重要问题或问题类别。
如果改变问题的一个因素可以简化 map/reduce,那肯定会很有趣。
谢谢
【问题讨论】:
标签: hadoop mapreduce apache-pig
我正在尝试了解 hadoop 和 map/reduce 的界限,这将有助于了解我们知道 map/reduce 无法解决的重要问题或问题类别。
如果改变问题的一个因素可以简化 map/reduce,那肯定会很有趣。
谢谢
【问题讨论】:
标签: hadoop mapreduce apache-pig
想到两件事:
任何需要实时/交互式/低延迟响应时间的事物。提交给 Hadoop 的任何作业都会产生固定成本。
任何不是embarrassingly parallel 的问题。 Hadoop 可以处理许多需要数据之间简单的相互依赖关系的问题,因为记录是在 reduce 阶段连接的。但是,某些图形处理和机器学习算法很难在 Hadoop 中编写,因为存在太多相互依赖的操作。一些机器学习算法需要非常低的延迟、对大量数据的随机访问,而 Hadoop 并没有开箱即用。
【讨论】:
您所说的“我们知道 map/reduce 无法提供帮助”并不完全清楚。其他答案似乎满足于一些例子,当它不是微不足道的,容易或不太困难如何使用 map reduce 来获得一些显着的加速时,但对于一个人来说容易的事情可能对其他人来说并不容易,而对于重要的人来说也是如此。 我个人会对一个说某事无法完成的定理感到更满意。如果我们看计算复杂度,有一类难以并行化的问题,即 P 完全问题。众所周知的此类问题是上下文无关语法识别(对编译器很重要)、线性规划和一些压缩问题。*条目有更多。
有些人正在为 map reduce 制作新的复杂度类。我非常怀疑,但陪审团不知道这些会有多大用处。
另一个问题是:我们可以在 map reduce 中模拟任何并行算法吗?当然,我们无法通过 P-complete 问题 map reduce 我们的方式,但也许有一些问题可以并行解决,但在 mapreduce 中无法解决。我不知道任何此类问题,但我知道一篇指向相反方向的论文,尽管是在一些假设下 “在 MapReduce 框架中模拟并行算法并应用到并行计算几何”,Michael T. Goodrich
在实践中,我们几乎没有时间思考 map reduce 的方式和开发特定于该模型的算法技术,我看到新的问题落在 map reduce 解决方案上。当一切尘埃落定时,我们可能会发现 mapreduce 比最初看起来更强大。
【讨论】:
我认为任何无法通过divide and conquer 解决的问题都不能很好地与hadoop 一起使用。如果算法可以修改为能够创建子任务,那么我猜它可以在hadoop下很好地运行。
要添加到您的问题(而不是答案,我是否将这部分评论作为评论?),如果有我可以将问题分解成的子任务,但没有明确的方法来执行 filter hadoop的阶段?我想仍然可以将 hadoop 用于map 阶段并在单台机器上进行缩减。
【讨论】:
正如其他人所说:问题必须易于切割成可以独立处理的部分。
所以,让我举两个我过去作为 WebAnalytics 架构师的例子(本质上,我试图做 Hadoop 现在提供的东西……没有 hadoop……在具有多个 CPU 内核的单个系统上使用 bash shell 脚本)。我希望这两个能让您对这些边界在现实生活中的样子有所了解。
上下文:
假设你有一个很大的身体 来自网络服务器的日志。和你 想分析行为 访客。你需要一个属性 可靠地告诉您哪个请求是 由哪个用户完成。
我的两个例子:
过去有人曾告诉我,流体动力学方程 (Navier–Stokes) 不能拆分为“Mapreducable”部分。尽管我确实看到了为什么这是正确的一些逻辑(流体的每个部分都会影响流体的每个其他部分);我应该明确指出,我什至不会尝试理解这些方程式。
我希望这些例子能帮助你找到边界。
【讨论】:
回复 Gangadhar(抱歉,cmets 框空间不足):
我喜欢你关于分而治之的回答,但我要补充一点。 Mapreduce 不能很好地处理分治算法的递归方面,因为某些 d/c 算法的子问题的组合取决于最终减少到一个键。以merge sort algorithm 为例(暂时忽略 Hadoop 中的排序是微不足道的,因为其 Mapreduce 实现的关键排序属性):您将使用您的映射器将您的数据划分为两个块,使用任意 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 配合使用。
【讨论】: