我想在使用 Hazelcast 的集群中彼此共享的两个实例中运行 java 任务。这样,任务可以更快地完成,而不是在单个实例中运行。请帮忙!
问问题
406 次
1 回答
2
从您发布的问题中,您的问题不是很清楚。你的大任务可能是做以下事情之一。
- 处理存储在 hazelcast 分布式数据结构中的数据(数据密集型)。
- 来自 hazelcast 的数据有限或没有数据的数字运算(CPU 密集型)操作。
在这两种情况下,您都可以在 hazelcast 中使用 ExecutorService 的分布式实现。请参阅以下链接:
http://docs.hazelcast.org/docs/3.5/javadoc/com/hazelcast/core/IExecutorService.html
对于案例 1),由于 hazelcast 将数据划分为多个节点(实例),因此您可以通过调用 executeOnKeyOwner() 方法在密钥所有者上执行任务,如下所示。
示例代码
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
Map<Integer, String> map = hz.getMap("yourMap");
for (int key = 0; key < 100; key++)
map.put(key, "someValue");
IExecutorService executor = hz.getExecutorService("executor");
for (Integer key : map.keySet())
executor.executeOnKeyOwner(new YourBigTask(), key);
YourBigTask 是您的“大任务类”,将在 run() 方法中实现Runnable
和接口并进行必要的处理。Serializable
如果您需要在内部使用 hzinstance run()
,也请实施HazelcastInstanceAware
。
对于案例 2)你可以打电话
executor.executeOnAllMembers(new YourBigTaskClass());
这将在所有已知的集群成员上执行您的任务。
希望这可以帮助。我仍然鼓励您查看其他方法,IExecutorService
并以最佳方式使用最适合您问题的方法。
于 2015-09-26T09:07:58.870 回答