请纠正我,如果我错了的话,我的理解是Hadoop在不同节点之间的通信中不使用MPI。
这是由于什么技术原因呢?
我可以猜测一些原因,但我不了解MPI的底层实现,无法确定自己的推测是否正确。
说起来,我对Hadoop的内部也并不十分熟悉。我理解这个框架的概念(map/combine/shuffle/reduce以及它们在高级别上的工作原理),但不知道细节实现。我一直认为Hadoop在传输序列化的数据结构(可能是GPBs)时使用TCP连接,例如在shuffle阶段。如果不是这样,请让我知道。
请纠正我,如果我错了的话,我的理解是Hadoop在不同节点之间的通信中不使用MPI。
这是由于什么技术原因呢?
我可以猜测一些原因,但我不了解MPI的底层实现,无法确定自己的推测是否正确。
说起来,我对Hadoop的内部也并不十分熟悉。我理解这个框架的概念(map/combine/shuffle/reduce以及它们在高级别上的工作原理),但不知道细节实现。我一直认为Hadoop在传输序列化的数据结构(可能是GPBs)时使用TCP连接,例如在shuffle阶段。如果不是这样,请让我知道。
MPI是消息传递接口。从名称就可以看出 - 没有数据局部性。你将数据发送到另一个节点进行计算。因此,在处理大型数据时,MPI的性能受到网络限制。
使用Hadoop分布式文件系统的MapReduce会复制数据,以便您可以在本地存储中进行计算 - 直接从磁盘流式传输到处理器。因此,MapReduce利用本地存储来避免在处理大数据时的网络瓶颈。
这并不意味着MapReduce不使用网络...它确实会使用:洗牌通常是作业中最慢的部分!但是它尽可能少地、尽可能高效地使用它。
总之:Hadoop(以及其之前的Google东西)没有使用MPI,因为它不能使用MPI工作。 MapReduce系统是专门开发的,以应对MPI在硬件趋势方面的缺点:磁盘容量爆炸(以及随之而来的数据),磁盘速度停滞不前,网络速度慢,处理器千兆赫达到顶峰,多核取代了摩尔定律。
没有任何限制阻止MPI程序使用本地磁盘。当然,MPI程序总是尝试在数据上本地工作,无论是在RAM还是本地磁盘上,就像所有并行应用程序一样。在MPI 2.0中(这不是未来版本,它已经存在了十年),可以动态添加和删除进程,这使得实现可以从例如某个节点上的进程死亡中恢复的应用程序成为可能。
也许hadoop没有使用MPI,因为MPI通常需要使用C或Fortran编码,并具有更科学/学术的开发人员文化,而hadoop似乎更受具有强烈Java偏见的IT专业人员的推动。MPI非常低级且容易出错。它允许非常高效的硬件、RAM和网络使用。Hadoop试图成为高级别且健壮的,但会有效率惩罚。 MPI编程需要严格遵循规范并极其小心才能被移植,仍然需要在每个平台上从源代码进行编译。 Hadoop易于移植,易于安装,并允许相当快速和简单的应用程序开发。 这是一个不同的范围。
尽管如此,也许hadoop的热潮会被更高效资源的替代品所跟随,也许是基于MPI。