我有一个运行在集群/网格上的应用程序,在这里我需要运行N个不必通信的任务。我只需要收集每个任务的结果。因此,我有一个Master将任务分配给一些Slave(可能在不同的主机上运行),最后将所有结果组合在一起。
由于群集是由批处理系统控制的,因此每次运行都会更改节点的配置,并且我会获得一份已分配给我的作业列表。
我正在寻找一个库(纯Java)来帮助我。我看了以下内容:
MPJ-对我不起作用,因为当同一台计算机上有多个处理器可用时,MPJ的运行方式。它使用自定义类加载器,这给我正在加载的本机库带来了问题(它被加载了多次,因为自定义类加载器多次加载了该类)。
Hazelcast-原则上可以工作,但并不是真正做到这一点(我可以将作业分配到一个队列中,然后将结果放回另一个队列中,但这似乎有点过头了)。我喜欢的是设置节点组很容易(原则上只需要指定一个,其他节点就可以连接到它)。
Simon / RMI-我想我可以让每个从属服务器向主服务器注册,然后让主服务器将作业分配给每个从属服务器。或者让每个从属服务器请求将作业排队的队列和应从主服务器存储结果的队列。
Cajo-原则上可以工作,但我不想在网格网络上进行多播,Cajo似乎无法解决这一问题。
RabbitMQ-我不喜欢运行额外的服务器,它也不是纯Java。与ZeroMQ相同。
Akka-似乎也太矫kill了。并大量配置来设置节点组。
Hadoop-像Akka一样似乎是一个过大的杀伤力,尤其是用于设置节点组的配置。
JPPF-似乎更适合于设置长时间运行的服务器和节点集群。应用程序完成后,我需要停止所有服务器和节点。而且它似乎依赖于任务的序列化,这对我来说不是一个选择(请参阅下文)
所以我会坚持使用Hazelcast或Simon。哪一种最适合这种应用?有谁知道另一个库(不太繁重,没有太多配置)。还有其他建议吗?
Hazelcasts ExecutorService不可选项。因为我使用的是JNI,所以序列化会很麻烦。
最佳答案
我终于与MPJ达成和解。可以通过不使用MPJ中包含的脚本,而是直接使用以下参数直接调用Java程序来解决自定义类加载器的问题:
java类排名mpj-config niodev [应用程序的附加参数]
MPI_Init调用将删除rank,mpj-config和niodev参数。
mpj-config是一个列出等级数,消息协议的切换阈值以及具有相应端口号和等级的主机的列表的文件。 niodev指定了通信机制(有关更多详细信息,请参见MPJ-Express文档)。配置文件可能如下所示:
3
131072
a6444@20000@0
a6444@20002@1
a6413@20000@2
必须将同一主机上的端口号分隔2,因为MPJ使用指定的端口+下一个端口(例如20000和20001)。
Simon和Hazelcast也是不错的解决方案,但它们比MPJ慢一点。特别是两者的初始化要慢得多。
关于java - 网格上的Java任务分发和收集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17829463/