据我了解,MPI让我能够更好地控制群集中不同节点的通信方式。
在MapReduce / Hadoop中,每个节点进行一些计算,与其他节点交换数据,然后整理其结果分区。看起来很简单,但由于您可以迭代这个过程,甚至像K-means或PageRank这样的算法也能很好地适应模型。在具有调度位置的分布式文件系统上,性能显然很好。相比之下,MPI让我可以明确控制节点如何相互发送消息。
任何人都可以描述一个集群编程场景,其中更通用的MPI模型比简单的MapReduce模型更明显吗?
答案 0 :(得分:26)
几乎所有科学代码 - 有限差异,有限元等等。哪种导致循环答案,任何不容易映射到MapReduce的分布式程序都可以用更通用的MPI模型更好地实现。不确定这对你有多大帮助,我会在发布后直接回答这个问题。
答案 1 :(得分:22)
虽然这个问题已得到解答,但我想补充/重申一个非常重要的观点。
MPI最适合需要大量进程间通信的问题。
当数据变大(PB,任何人?),并且几乎没有进程间通信时,MPI就变得很痛苦。这是因为进程将花费所有时间相互发送数据(带宽成为限制因素),并且您的CPU将保持空闲状态。也许更大的问题是阅读所有数据。
这是Hadoop之类的基本原因。数据也必须分发 - Hadoop分布式文件系统!
简而言之,MPI适用于任务并行,Hadoop适用于数据并行。
答案 2 :(得分:1)
我能想出的最佳答案是MPI在两种情况下优于MapReduce:
用于简短任务而非批处理。例如,MapReduce不能用于响应单个查询 - 每个作业需要几分钟。我认为在MPI中,您可以构建一个查询响应系统,其中机器相互发送消息以路由查询并生成答案。
对于作业节点,需要比迭代的MapReduce作业支持更多,但不要太多,以免通信开销使计算变得不切实际。不过,我不确定这种情况在实践中经常出现的情况。
答案 3 :(得分:1)
当任务迭代一个大小与处理器缓存相当的数据集时,以及经常需要与其他任务进行通信时,我希望MPI能够轻松胜过MapReduce。许多科学领域分解并行化方法符合这种模式。如果MapReduce需要顺序处理和通信,或者结束进程,那么处理缓存大小问题的计算性能优势就会丢失。
答案 4 :(得分:1)
当您使用的计算和数据具有不规则行为时,这些行为主要转换为对象之间的许多消息传递,或者当您需要低级硬件级别访问时,例如RDMA然后MPI更好。在这里你看到的一些答案中提到了任务或内存一致性模型的延迟,像Spark这样的框架或像AKKA这样的Actor模型已经表明它们可以与MPI竞争。最后,我们应该考虑到MPI多年来一直是开发科学计算所需库的主要基础的好处(这是使用DAG / MapReduce模型的新框架中缺少的最重要的缺失部分)。
总而言之,我认为MapReduce / DAG模型带来的好处就像动态资源管理器和容错计算一样,这使得它们对科学计算组来说是可行的。