为什么不使用MPI实现Hadoop?

38

请纠正我,如果我错了的话,我的理解是Hadoop在不同节点之间的通信中不使用MPI。

这是由于什么技术原因呢?

我可以猜测一些原因,但我不了解MPI的底层实现,无法确定自己的推测是否正确。

说起来,我对Hadoop的内部也并不十分熟悉。我理解这个框架的概念(map/combine/shuffle/reduce以及它们在高级别上的工作原理),但不知道细节实现。我一直认为Hadoop在传输序列化的数据结构(可能是GPBs)时使用TCP连接,例如在shuffle阶段。如果不是这样,请让我知道。

6个回答

29

Hadoop/Map-Reduce的重要特性:容错功能

Hadoop/Map-Reduce 的一个重大特点是其容错功能,然而在当前(所有?)MPI 实现中并不支持此功能。尽管如此,未来版本的OpenMPI正在思考引入该特性。

Sandia实验室开发了一种使用MPI的map-reduce版本,但是缺乏容错功能。


所以,您的意思是问题不在于MPI范例本身,而只是当前实现?这样听起来,目前可能会因为网络消息损坏或节点不稳定而使MPI系统崩溃。假设这两个因素都被消除了。那么使用MPI来实现Hadoop是否仍有任何理由不这样做? - artif
我认为这是一个合理的答案。 - chain ro

18

MPI是消息传递接口。从名称就可以看出 - 没有数据局部性。你将数据发送到另一个节点进行计算。因此,在处理大型数据时,MPI的性能受到网络限制。

使用Hadoop分布式文件系统的MapReduce会复制数据,以便您可以在本地存储中进行计算 - 直接从磁盘流式传输到处理器。因此,MapReduce利用本地存储来避免在处理大数据时的网络瓶颈。

这并不意味着MapReduce不使用网络...它确实会使用:洗牌通常是作业中最慢的部分!但是它尽可能少地、尽可能高效地使用它。

总之:Hadoop(以及其之前的Google东西)没有使用MPI,因为它不能使用MPI工作。 MapReduce系统是专门开发的,以应对MPI在硬件趋势方面的缺点:磁盘容量爆炸(以及随之而来的数据),磁盘速度停滞不前,网络速度慢,处理器千兆赫达到顶峰,多核取代了摩尔定律。


24
这个回答有些误导性。大部分MPI程序并不会将所有数据都发送到网络上,它们通常是并行模拟,并且随着模拟的进行只向邻居发送最小限度的更新。例如,在流体力学代码中进行的Halo交换。对于MapReduce来说,MPI并不合适,因为它不可靠:如果一个进程死了,整个任务就会失败。这是MPI不是MapReduce的最主要原因。MPI适用于在快速可靠网络(超级计算机)上运行紧密耦合的应用程序,而MapReduce则设计用于在慢速不可靠的硬件上运行尴尬的并行工作负载。 - Todd Gamblin
4
不正确的信息,得到了-1分。传递的“消息”并不是整个数据集,MPI应用程序肯定可以具有数据局部性。MPI和Hadoop有些正交,它们的重叠部分并不是你回答这个问题的地方。使用Hadoop执行的作业绝对可以使用MPI并且工作良好,只是更加基础的环境,没有像Hadoop那样强大的功能(但具有更多优化机会的好处)。 - Nick Bastin

9
事实上,可以使用MPI来实现Hadoop。自MPI存在以来,MapReduce一直通过MPI使用。MPI具有像“bcast” - 广播所有数据,“alltoall” - 将所有数据发送到所有节点,“reduce”和“allreduce”等功能。 Hadoop通过将传出通信命令与reduc命令打包在一起,消除了显式实现数据分发和收集结果方法的要求。好处是您需要确保在实现Hadoop之前,您的问题适合“reduce”函数。也许您的问题更适合于“scatter” / “gather”,因此您应该使用MPI的Torque / MAUI / SGE而不是Hadoop。最后,除非您在接收方法之后进行磁盘写入,否则MPI不会像另一篇帖子中描述的那样将数据写入磁盘。它的工作方式与Hadoop一样,通过将您的过程/数据发送到其他地方来完成工作。重要的是要足够详细地了解您的问题,以确保MapReduce是最有效的并行化策略,并且要知道许多其他策略存在。

4

没有任何限制阻止MPI程序使用本地磁盘。当然,MPI程序总是尝试在数据上本地工作,无论是在RAM还是本地磁盘上,就像所有并行应用程序一样。在MPI 2.0中(这不是未来版本,它已经存在了十年),可以动态添加和删除进程,这使得实现可以从例如某个节点上的进程死亡中恢复的应用程序成为可能。

也许hadoop没有使用MPI,因为MPI通常需要使用C或Fortran编码,并具有更科学/学术的开发人员文化,而hadoop似乎更受具有强烈Java偏见的IT专业人员的推动。MPI非常低级且容易出错。它允许非常高效的硬件、RAM和网络使用。Hadoop试图成为高级别且健壮的,但会有效率惩罚。 MPI编程需要严格遵循规范并极其小心才能被移植,仍然需要在每个平台上从源代码进行编译。 Hadoop易于移植,易于安装,并允许相当快速和简单的应用程序开发。 这是一个不同的范围。

尽管如此,也许hadoop的热潮会被更高效资源的替代品所跟随,也许是基于MPI。


1
如果只看Hadoop的Map/Reduce步骤和调度部分,我认为MPI是一种更好的方法/技术。MPI支持许多不同的交换模式,如广播、屏障、收集所有、散布/聚集(或称之为映射/减少)。但是Hadoop还拥有HDFS。通过这个,数据可以离处理节点更近。如果你看一下Hadoop等技术所用的问题空间,那么减少步骤的输出实际上相当大,你不想让所有的信息淹没了你的网络。这就是为什么Hadoop将所有内容保存到磁盘中的原因。但控制消息可以使用MPI,并且MPI消息可以只有指向磁盘上实际数据的指针(URL或文件句柄)...

1
在MapReduce 2.0(MRv2)或YARN中,可以编写应用程序(或正在移植以运行)在其之上。因此,将会有下一代Apache Hadoop MapReduce(MAPREDUCE-279),并且支持多种编程范例。因此,可以在YARN上编写MPI应用程序。MapReduce编程范例将始终作为默认支持。http://wiki.apache.org/hadoop/PoweredByYarn应该能够给出使用YARN开发的所有应用程序的想法,包括Open MPI。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接