为啥不使用 MPI 实现 Hadoop?
Posted
技术标签:
【中文标题】为啥不使用 MPI 实现 Hadoop?【英文标题】:Why isn't Hadoop implemented using MPI?为什么不使用 MPI 实现 Hadoop? 【发布时间】:2011-06-03 04:54:05 【问题描述】:如果我错了,请纠正我,但我的理解是 Hadoop 不使用 MPI 进行不同节点之间的通信。
这是什么技术原因?
我可以大胆猜测一下,但我对 MPI 是如何“在幕后”实施的了解不够,无法知道我是否正确。
想想看,我也不完全熟悉 Hadoop 的内部结构。我在概念层面了解框架(map/combine/shuffle/reduce 以及它如何在高层次上工作),但我不知道具体的实现细节。我一直假设 Hadoop 通过 TCP 连接传输序列化数据结构(可能是GPBs),例如在随机播放阶段。如果这不是真的,请告诉我。
【问题讨论】:
【参考方案1】:Hadoop/map-reduce 的一大特点是容错性。大多数(任何?)当前 MPI 实现都不支持容错。正在考虑将其用于OpenMPI 的未来版本。
Sandia labs 有一个使用 MPI 的 map-reduce 版本,但它缺乏容错能力。
【讨论】:
所以,您是说原因不是 MPI 范式本身固有的,只是当前的实现?所以听起来目前,损坏的网络消息或变化无常的节点可能会导致 MPI 系统崩溃。假设这两个因素都被删除了。是否还有理由不使用 MPI 实现 Hadoop? 我认为这是一个合理的答案。【参考方案2】:MPI 是消息传递接口。就在名称中 - 没有数据局部性。您将数据发送到另一个节点以进行计算。因此,在处理大数据时,MPI 在性能方面受网络限制。
使用 Hadoop 分布式文件系统的 MapReduce 复制数据,以便您可以在本地存储中进行计算 - 从磁盘流式传输并直接传输到处理器。因此 MapReduce 在处理大数据时利用本地存储来避免网络瓶颈。
这并不是说 MapReduce 不使用网络……它确实使用了:而且 shuffle 通常是工作中最慢的部分!但它尽可能少地使用它,并且尽可能高效。
总结一下:Hadoop(以及之前的 Google 产品)没有使用 MPI,因为它无法使用 MPI 并工作。 MapReduce 系统是专门为解决 MPI 的缺点而开发的,它根据硬件趋势:磁盘容量爆炸(以及随之而来的数据)、磁盘速度停滞、网络缓慢、处理器达到千兆赫兹峰值、多核接管摩尔定律。
【讨论】:
这是一个非常错误的答案。大多数 MPI 程序不会通过网络发送所有数据。它们通常是并行模拟,并且随着模拟的进行只会向邻居发送最少的更新。例如,流体动力学代码中的光环交换。对于 MapReduce,MPI 没有意义,因为它不可靠:如果一个进程死了,整个工作就死了。这是 MPI 不是 MapReduce 的重要基础的主要原因。 MPI 用于在快速、可靠的网络(超级计算机)上紧密耦合的应用程序,而 MapReduce 旨在用于在缓慢、不可靠的硬件上运行令人尴尬的并行工作负载。 -1 表示不正确的信息。传递的“消息”不是整个数据集,MPI 应用程序肯定可以具有数据局部性。 MPI 和 Hadoop 在某种程度上是正交的,它们重叠的地方不是您回答这个问题的地方。使用 Hadoop 执行的作业绝对可以使用 MPI 并且工作正常,它只是一个更简单的工作环境,比 Hadoop 做的工作量更少(但有更多的优化机会)。【参考方案3】:事实上,Hadoop 可以使用 MPI 来实现。只要 MPI 存在,MapReduce 就一直通过 MPI 使用。 MPI 具有像'bcast' - 广播所有数据,'alltoall' - 将所有数据发送到所有节点,'reduce' 和'allreduce' 等功能。 Hadoop 通过将传出通信命令与 reduce 命令打包,消除了显式实现数据分发和收集结果方法的要求。好处是在实现 Hadoop 之前,您需要确保您的问题符合“减少”功能。这可能是您的问题更适合“分散”/“聚集”,您应该使用带有 MPI 而不是 Hadoop 的 Torque/MAUI/SGE。最后,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。
【讨论】:
【参考方案5】:在 MapReduce 2.0 (MRv2) 或 YARN 应用程序可以在 YARN 之上编写(或移植到运行)。
因此,基本上会有下一代 Apache Hadoop MapReduce (MAPREDUCE-279) 和一种在其之上支持多种编程范式的方法。因此可以在 YARN 上编写 MPI 应用程序。默认情况下始终支持 MapReduce 编程范式。
http://wiki.apache.org/hadoop/PoweredByYarn 应该了解所有应用程序都是在 YARN 之上开发的,包括 Open MPI。
【讨论】:
【参考方案6】:如果我们只看 Hadoop 的 Map/Reduce 步骤和调度部分,那么我认为 MPI 是一种更好的方法/技术。 MPI 支持许多不同的交换模式,如广播、屏障、全部收集、分散/收集(或称为 map-reduce)。但 Hadoop 也有 HDFS。这样,数据可以更靠近处理节点。而且,如果您查看使用类似 Hadoop 的技术的问题空间,减少步骤的输出实际上相当大,您不希望所有这些信息淹没您的网络。这就是 Hadoop 将所有内容保存到磁盘的原因。但是控制消息可能使用了 MPI,而 MPI 消息可能只有指向磁盘上实际数据的指针(url 或文件句柄)......
【讨论】:
以上是关于为啥不使用 MPI 实现 Hadoop?的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop MapReduce vs MPI(vs Spark vs Mahout vs Mesos) - 何时使用一个而不是另一个?