我有 7 台计算机运行带有四核处理器的 Gentoo Linux,我希望能够将程序的执行分发到所有这些计算机。我有一些多线程程序,我想使用集群上的所有 28 个可用 CPU,而不是在每个节点上运行 7 个程序副本。
这就像distcc的想法:我有我的 C/C++ 项目,如果我用distcc
而不是编译源代码gcc
,它会将编译过程分发到多台计算机,即使在 Makefile 中我也不必更改任何内容。
对于集群,如果我不必更改程序源代码中的任何内容会更好(尽管我认为这是不可能的)。但如果需要,我可以更改程序以使用外部 API。
有几种方法可以做到这一点,但我怀疑它们中的任何一种都会让您按原样运行代码。
对于某些类型的工作负载, Hadoop似乎是一个不错的选择,并且被 Yahoo 和其他公司广泛使用和维护。
Beowulf集群更像是一个传统的集群。如果您查看Beowulf Wikipedia 页面,则可以找到替代方案的链接以及专注于Rocks等集群的 Linux 发行版。
从您的问题来看,您似乎希望所有机器神奇地绑定在一起,以制作一台可以登录并在其上运行程序的大型计算机。这种魔法称为SSI(单一系统映像),有许多集群包可以做到这一点。尝试维基百科页面上列出的任何一个。
如果你想要一个传统的集群或网格设置,你只需要一个像Torque或Grid Engine这样的作业管理器。 ROCKS是开始使用这种设置的快速方法。
这个问题的答案是高度应用特定的。3dinfluence 已经提到了 Hadoop 的可能性,如果您的应用程序分解为 Map-Reduce 执行模型,这是非常棒的。
如果您计划将工作负载分配到多个节点,但仍希望在类似线程的执行模型中只拥有一个应用程序实例,则需要研究某种形式的 MPI。
MPI 是具有通用接口的标准,但它有多种实现,例如OpenMPI和MPICH。本质上,您将应用程序设计为生成多个副本,这些副本在彼此之间传递消息。MPI 然后抽象出实际的通信方法。相反,它提供了您在应用程序设计中使用的一系列原始功能,例如发送、接收和广播。然后,实际通信由您选择的 MPI 堆栈中的模块处理。
OpenMPI 包括许多传输,包括共享内存、TCP/IP、InfiniBand、Myrinet Express 等等。您使用哪些以及如何配置它们再次高度依赖于应用程序。
通常,您的 MPI 任务将使用某种批处理排队系统(例如Torque或Sun Grid Engine )分配到集群上的节点。如果您在多个用户之间共享集群并需要安排集群资源,这些将变得更加有用。
我建议您查看Gentoo Cluster 项目站点并查看一些链接资源。这些将帮助您更好地了解在集群环境中运行的应用程序,并帮助您缩小需要更多帮助的领域。
您可以考虑使用像Cluster Knoppix这样的 LiveCD 发行版来测试这个想法。