gpt4 book ai didi

Java任务在网格上的分配和收集

转载 作者:行者123 更新时间:2023-12-01 04:32:34 24 4
gpt4 key购买 nike

我有一个应用程序在集群/网格上运行,我需要在其中运行 N 个无需通信的任务。我只需要收集每项任务的结果。因此,我有一个 Master 将任务分配给一些 Slave(可能在不同的主机上运行),并在最后合并所有结果。

由于集群是由批处理系统控制的,因此每次运行时我的节点配置都会发生变化,并且我会获得为我的工作分配给我的节点列表。

我正在寻找一个库(纯Java)来帮助我解决这个问题。我查看了以下内容:

MPJ - 对我不起作用,因为当同一台计算机上有多个可用处理器时 MPJ 的运行方式。它使用自定义类加载器,这给我正在加载的 native 库带来了问题(它加载了多次,因为自定义类加载器多次加载该类)。

Hazelcast - 原则上可以工作,但它并不是真正为此而设计的(我可以使用队列分配作业并将结果放回到另一个队列中,但这似乎有点过大)。我喜欢的是它很容易设置一组节点(原则上只需要指定一个节点,其他节点就可以连接到它)。

Simon/RMI - 我想我可以让每个从站向主站注册,然后让主站将作业分配给每个从站。或者让每个从站请求一个用于排队作业的队列和一个用于存储来自主站的结果的队列。

Cajo - 原则上可以工作,但我不想在网格网络上进行多播,而且 Cajo 似乎没有办法解决这个问题。

RabbitMQ - 我不喜欢运行额外的服务器,而且它不是纯 Java。与 ZeroMQ 相同。

Akka - 似乎也太过分了。还有很多配置来设置节点组。

Hadoop - 像 Akka 一样似乎有点矫枉过正,尤其是设置节点组的配置。

JPPF - 似乎更适合设置长期运行的服务器和节点集群。我的应用程序完成后,我需要停止所有服务器和节点。此外,它似乎依赖于任务的序列化,这对我来说不是一个选择(请参阅下文)

所以我会坚持选择 Hazelcast 或 Simon。哪一种更适合这种应用?有谁知道另一个库(不是太重,不是太多配置)。还有其他建议吗?

顺便说一句,Hazelcasts ExecutorService 不是一个选项。因为我正在使用一些 JNI,所以序列化会很痛苦。

最佳答案

我最终与 MPJ 达成和解。自定义类加载器的问题可以简单地通过不使用 MPJ 中包含的脚本而是使用以下参数直接调用 java 程序来规避:

java 类排名 mpj-config niodev [应用程序的其他参数]

rank、mpj-config 和 niodev 参数将被 MPI_Init 调用删除。mpj-config 是一个文件,列出了等级数、消息协议(protocol)的切换阈值以及具有相应端口号和等级的主机列表。 niodev 指定通信机制(有关更多详细信息,请参阅 MPJ-Express 文档)。配置文件可能如下所示:

3
131072
a6444@20000@0
a6444@20002@1
a6413@20000@2

将同一主机上的端口号用 2 分隔很重要,因为 MPJ 使用指定的端口 + 下一个端口(例如 20000 和 20001)。

Simon 和 Hazelcast 也是不错的解决方案,但它们比 MPJ 慢一点。尤其是两者的初始化都慢了很多。

关于Java任务在网格上的分配和收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17829463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com